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