所以,我在我的客户端编写了一个线程,它试图从套接字流中readObject()
。
只要客户端连接,该线程就会运行。
可以在客户端的GUI上关闭与服务器的连接。
如果客户端通过单击确定断开连接(这不会退出客户端程序)
“disconnect”菜单选项,套接字将关闭,isConnected
设置为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()
将阻塞,并检查客户端是否仍然连接,我将其包装在while
中,检查(每次超时)客户端套接字是否仍然连接。< / p>
我现在的问题:
如果readObject()
开始获取服务器传递的对象,尝试读取它,但在处理超时时,流上的数据是否会以某种方式“损坏”,因为它取消了。
或者我应该让readObject()
阻止并在GUI线程想要关闭套接字时捕获异常。
我对套接字不太熟悉,也许我的方法完全没错。
答案 0 :(得分:2)
套接字读取超时将导致SocketTimeoutException
抛出readObject()
。您可能无法重用ObjectInputStream
,并且流可能会被损坏,因为其当前位置将基本保持不变。
这可能只能通过关闭并重新打开连接来解决。