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