Jon*_*uer 6 java sockets socket-timeout-exception
所以,我在我的客户端写了一个线程,它试图readObject()从套接字流.
该线程在客户端连接时运行.
可以在客户端的GUI上关闭与服务器的连接.如果客户端通过单击"断开连接"菜单选项决定断开连接(这不会退出客户端程序),则将关闭套接字并将a 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(...){}
Run Code Online (Sandbox Code Playgroud)
}
我知道readObject()会阻塞,并检查客户端是否仍然连接,我将其包装在一个中while,检查(每次超时)客户端套接字是否仍然连接.
我现在的问题是:
如果readObject()开始获取服务器传递的对象,尝试读取它,但在处理超时时,流上的数据会以某种方式被"损坏",因为它被取消了.或者我应该让readObject()块,并在GUI线程想要关闭套接字时捕获异常.
我对套接字不太熟悉,也许我的方法完全错了.
套接字读取超时将导致SocketTimeoutException抛出a readObject()。您可能无法重复使用它ObjectInputStream,并且流可能会被损坏,因为它的当前位置在很大程度上保持未定义状态。
这可能只能通过关闭并重新打开连接来解决。