所以,我在我的客户端写了一个线程,它试图readObject()
从一个套接字流。
只要客户端连接,此线程就会运行。
可以在客户端的 GUI 上关闭与服务器的连接。如果客户端决定通过单击“断开连接”菜单选项断开连接(这不会退出客户端程序),则套接字将被关闭并将 aisConnected
设置为 false。
由于客户端读取线程尝试readObject()
从流中读取,而连接可以通过 GUI 关闭,我将超时设置为 250 毫秒(setSoTimeout(250)
)。
@Override
public void run()
{
this.connection = this.connectionHandler.getSocket();
while(connectionHandler.isConnected())
{
this.readCircle();
}
this.connectionHandler.setReadTaskRunning(false);
}
private void readCircle()
{
try
{
this.connection.setSoTimeout(250);
this.connectionHandler.readData(); //this uses readObject().
}
catch(SocketTimeoutException timeout){}
catch(...){}
}
我知道这readObject()
会阻塞,为了检查客户端是否仍然连接,我将它包装在 a 中while
,它检查(每次超时)客户端套接字是否仍然连接。
我现在的问题:
如果readObject()
开始获取服务器传递的对象,尝试读取它,但在处理超时时,流上的数据会以某种方式“损坏”,因为它被取消了。readObject()
或者如果GUI线程想要关闭套接字,我应该让块并捕获异常。
我对套接字不是很有经验,也许我的方法是错误的。