Java - readObject()和setSoTimeout()

时间:2013-02-21 10:17:29

标签: java sockets socket-timeout-exception

所以,我在我的客户端编写了一个线程,它试图从套接字流中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线程想要关闭套接字时捕获异常。

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

1 个答案:

答案 0 :(得分:2)

套接字读取超时将导致SocketTimeoutException抛出readObject()。您可能无法重用ObjectInputStream,并且流可能会被损坏,因为其当前位置将基本保持不变。

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