Java-readObject () и setSoTimeout()

Итак, я написал поток на стороне моего клиента, который пытается readObject() из потока сокета.

этот поток выполняется до тех пор, пока клиент подключен.

соединение с сервером может быть закрыто на GUI клиента. Если клиент решает отключить (это не будет выходить из клиентской программы), нажав кнопку опция меню "Отключить", сокет будет закрыт и isConnected имеет значение false.

так как клиенты читают поток пытается readObject() от поток, в то время как соединение может быть закрыто через GUI, я установил тайм-аут в 250ms (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, который проверяет (каждый тайм-аут), если клиентский сокет все еще подключен.

мой вопрос:

в случае, если readObject() начинает получать объект, переданный сервером, пытается его прочитать, но при обработке происходит тайм-аут, будут ли данные в потоке каким-то образом" повреждены", потому что он отменен. Или я должен просто позволить readObject() заблокировать и поймать исключение, если поток GUI хочет закрыть сокет.

Я не очень опытен в сокетах, и, возможно, мой подход вообще неправильный.

1 ответов


тайм-аут чтения сокета вызовет SocketTimeoutException быть брошенным readObject(). Возможно, вы не сможете повторно использовать это ObjectInputStream, и поток может быть поврежден, потому что его нынешняя должность будет оставаться в значительной степени неопределен.

Это, вероятно, может быть исправлено только путем закрытия и повторного открытия соединения.