Java - readObject() и setSoTimeout()

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

Этот поток работает до тех пор, пока клиент подключен.

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

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

Мой вопрос сейчас:

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам