2015-10-22 2 views
0

Следующий код должен обнаружить, что больше нет байтов для чтения. Однако он просто зависает, пока клиентское соединение не будет закрыто.как обнаружить конец сокета InputStream?

Сервер

 //... 

     StringBuilder builder = new StringBuilder(128); 
     byte[] buffer = new byte[1024]; 
     int length = 0; 

     while ((length = socket.getInputStream().read(buffer)) != -1) { 
      System.out.println(length); 
      builder.append(new String(buffer)); 
      System.out.println(builder.toString()); 
     } 

Client

//... 

    OutputStream stream = clientSocket.getOutputStream(); 
    stream.write("LIST".getBytes()); 
    stream.flush(); 

API-интерфейс и предыдущий ответ на такой вопрос гласит, что -1 должно означать, что нет символов для чтения, однако это петля пишет:

  • СПИСОК

  • висит в течение 20 секунд до тех пор, пока клиент не закрывает сокет и поднимает -1 завершить петлю.

Как я могу правильно определить, что в потоке больше нет символов?

После этого соединение должно оставаться открытым.

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

+0

Я пробовал с 0, и он зависает независимо. – John

+1

@vlp -1 в Java. 'InputStream.read()' не может вернуть ноль, если вы не предоставите буфер нулевой длины или нулевой счетчик. – EJP

ответ

4

API-интерфейс и предыдущий ответ на такой вопрос гласит, что -1 должно означать, что нет символов, чтобы быть считаны

Я не могу комментировать то, что некоторые uncited ответ мог бы сказать, но В документации API нет такой вещи. Он говорит, что -1 возвращается в конце потока. Конец потока в сокете возникает, когда партнер закрывает соединение или отключает его для вывода, а не раньше.

-1 не является индикатором конца сообщения.

+0

, так что нет такой вещи, чтобы обнаружить, что нет символов, которые нужно читать без блокировки или иметь собственный протокол? – John

+0

@John Это правильно. Если вам нужны сообщения, вы должны их реализовать самостоятельно: строки, префиксы длинного слова, самоописывающие протоколы, такие как XML, XDR, ... – EJP

+1

Что относительно 'available()' (мне просто интересно)? – vlp

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