Закрытие TCP-соединения со стороны сервера, при этом сообщая клиенту - PullRequest
2 голосов
/ 09 января 2012

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

while ((commandHeader = fromNode.readLine()) != null) {

, который внутренне вызывает readLine () для OutputStream, полученного из сокета TCP. Когда я вызываю socket.close () из другого потока, эти вызовы активируются с SocketException, и поток может быть прерван.

Однако, если клиент просыпается и решает выдать команду, он выполняет

stream.writeBytes("something\n");

который блокирует на неопределенный срок. Я понимаю, что это, вероятно, хорошо для TCP (это только наполовину близко). Я должен, вероятно, отправить что-то клиенту после выхода, например "QUIT \ n"; это может также просто прочитать EOF. Но если я вызываю readLine () или другие операции чтения на клиенте перед отправкой команды, они блокируют ожидание данных, когда соединение не закрыто. Как клиент может обнаружить, что соединение было наполовину закрыто, прежде чем пытаться записать в него?

Ответы [ 2 ]

3 голосов
/ 09 января 2012

Когда socket.close () вызывается на сервере, базовое TCP-соединение закрывается с типичной последовательностью FIN / FIN-ACK плюс пакеты RST, поэтому клиент будет знать . Когда клиент вызывает stream.writeBytes () впоследствии, он должен потерпеть неудачу. Если это не так, это означает, что были некоторые пропущенные пакеты, и соединение в конечном итоге все равно будет разорвано.

2 голосов
/ 09 января 2012

Во-первых, я думаю, что логика вашего приложения должна быть такой, чтобы избежать подключения Half Open TCP. Можно подумать о добавлении таймера на стороне клиента, чтобы, если ничего не получено, он снова начал опросить сервер.

С точки зрения сервера, другой вариант - установить таймер на readLine. Создайте другой метод для readLine, в котором вы устанавливаете таймер и, если он превышает определенное время, просто возвращаете некоторое значение по умолчанию в цикл while.

РЕДАКТИРОВАТЬ:

Возможно, вы захотите прочитать эту статью особенно раздел: А как насчет потоков, заблокированных на IO?

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