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
и поток может быть поврежден, потому что его текущая позиция останется в значительной степени неопределенной.
Вероятно, это можно исправить только путем закрытия и повторного открытия соединения.