java nio: если read возвращает -1, значит ли это, что клиент закрыл соединение? - PullRequest
1 голос
/ 23 мая 2011

У меня есть вопрос со ссылкой на этот урок

http://rox -xmlrpc.sourceforge.net / niotut /

В методе чтения сервера, если read возвращает -1, это всегда означает, что клиент закрыл соединение ??

Я изменил пример клиента на долгое время после отправки сообщения. Я вижу, что selector.select () не блокирует и продолжает выбирать канал как читаемый, даже если клиент ничего не отправляет, а сервер читает метод, считывает и возвращает -1 и, таким образом, закрывает канал, но клиент не отключился.

Я не понимаю этого поведения. Может ли кто-нибудь помочь мне понять?

Я пытаюсь изменить сервер таким образом, чтобы сервер не отключался от клиента, даже если клиент ничего не отправляет, и поэтому он должен блокироваться в selector.select ().

спасибо!

Ответы [ 3 ]

3 голосов
/ 23 мая 2011

API должен работать как описано. Read вернет -1, когда соединение сокета будет закрыто. Это не то же самое, что «конец сообщения». Соединение может быть закрыто по тайм-ауту, и я отмечаю, что вы сказали, что клиент ожидал «долгое время».

Я также отмечаю, что вы работаете с конкретным учебником. Код клиента в этом руководстве специально закрывает соединение после получения ответа и открывает новый для каждой отправки. Чтобы остановить это, вам придется внести большие изменения в дизайн клиентского кода.

Когда я запускаю сервер nio из этого учебника с клиентом, который не закрывает соединение, поведение такое, как описывает API - серверный поток ждет в Selector.select (), пока клиент спит между отправкой сообщений.

Таким образом, мой ответ заключается в том, что вы, вероятно, используете клиент, который закрывает соединения, и если не «долгое время», которое вы ожидаете, может привести к тому, что сеть закроет соединения для вас. Учитывая поведение, которое вы описываете, я почти уверен, что это первое.

0 голосов
/ 23 мая 2011

Полагаю - но я не совсем уверен, потому что я не прочитал его полностью - вы ошибаетесь в разнице между Port-connection и Socket-connection.Насколько я понимаю, соединение открывается через сокет на конкретном порту.Розетка может быть закрыта, соответственнополучил конец сообщения, которое было отправлено - но соединение все равно может остаться.

Насколько я понимаю, -1 означает конец сообщений, отправленных через сокет-соединение.Нет четкого индикатора, который бы прямо указывал на то, что соединение закрыто.(Мои 2цента понимания.)

0 голосов
/ 23 мая 2011

В методе чтения сервера, если чтение возвращает -1, то делает это всегда значит клиент закрыл соединение?

Да. Всегда.

сервер читает метод, читает и возвращает -1 и, таким образом, закрывает канал, но клиент не отключился.

Да, это так. Вот что это значит. Клиент закрыл соединение.

...