6

所以,我在我的客户端写了一个线程,它试图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线程想要关闭套接字,我应该让块并捕获异常。

我对套接字不是很有经验,也许我的方法是错误的。

4

1 回答 1

2

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

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

于 2013-02-21T10:23:25.833 回答