2009-04-07 3 views
0

Похожие сообщения не отвечали на мой вопрос.Сервер отключается в Java

У меня есть сервер, который делает что-то вроде:

EVERY TWO SECONDS DO: 
if the inputstream is not null { 
    if inputStream.available() is 0 
    { 
      return 
    } 
    print "handling input stream" 
    handleTheInputStream(); 
} 

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

Возможно, что-то не так с тем, как я сейчас понимаю, как это работает.

Пожалуйста, помогите.

+0

Я думаю, что ваш псевдокод сломан. Если входной поток равен нулю, тогда inputStream.available() будет вызывать NPE ... –

+0

Спасибо, что указали это. Предполагается, что «входной поток не является нулевым и ...» – jbu

+0

В этом случае я подозреваю, что у вас появились неправильные ветви ... почему вы хотите обрабатывать входной поток, если он является нулевым или не имеет каких-либо данных ? –

ответ

3

Не используйте available() - что говорит или нет там в настоящее время имеются данные, не существует ли будет быть доступны в будущем данные. Другими словами, это неправильный инструмент для обнаружения отключения.

В основном вы должны позвонить read() (и обработать данные), пока он не вернет -1, и в этот момент это означает, что клиент отключился.

+0

Чтение возвращает -1, когда клиент отключился. – andri

+0

Проблема в том, что я не хочу менять существующий код на сервере, так как я его не писал. Я МОГУ ее изменить, но я хотел бы знать, что нет другого способа сделать это, прежде чем я попрошу изменить. Для изменения потребуется много регрессионного тестирования. – jbu

+0

@andri: Спасибо, исправлено. –

1

Если это делается с использованием сокетов, вы можете проверить различные методы экземпляра класса Socket, например isClosed() или isInputShutdown().

Конечно, это предполагает, что метод, работающий в этом потоке, имеет доступ к объекту Socket, а не только к InputStream.

Смежные вопросы