Java - readObject()和setSoTimeout()

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线程想要关闭套接字时捕获异常.

我对套接字不太熟悉,也许我的方法完全错了.

h22*_*h22 2

套接字读取超时将导致SocketTimeoutException抛出a readObject()。您可能无法重复使用它ObjectInputStream,并且流可能会被损坏,因为它的当前位置在很大程度上保持未定义状态。

这可能只能通过关闭并重新打开连接来解决。