2014-01-10 3 views
1

Я использую сканер для подключения сокетов в программе Client/Server.Когда блок Scanner.nextLine() блокируется?

Я хочу, чтобы Scanner.next() блокировался, поэтому поток сервера может ждать чего-то, что нужно прочитать.

Тем не менее, иногда дает мне:

java.util.NoSuchElementException: No line found 
    at java.util.Scanner.nextLine(Scanner.java:1585) 
    at cscie55.hw4.Server.serviceClient(Server.java:146) 
    at cscie55.hw4.Server.main(Server.java:106) 

документация Java говорит, что следующие() "иногда" блоки, и не сказать, является ли nextLine (блоков).

Некоторый код онлайн обертывает его в случае, если он проверяет значение null, но я читал, что он никогда не возвращает null. Что я должен сделать, чтобы блокировать работу IO в моем соке?

В частности,

Когда Scanner.nextLine() блок, а не бросать NoSuchElementException?

+0

Вы можете оставить свой код? Вы назначаете сканер в нескольких местах? – sasankad

ответ

0

Он блокируется, если он считывает данные из сети, и на входе нет данных или нет новой строки, и она не достигла EOS. Вы должны читать из файла.

+0

Я не читаю из файла. Ошибка происходит в конце первого клиентского соединения с сервером, а затем приводит к зависанию будущих подключений. Я думаю, мне нужно обернуть сканер сокетов в блок if, который проверяет hasNext(). Спасибо, что указали, что EOS позволяет мне разобраться, когда он блокируется, и когда он «знает», больше данных не поступает. –

3

Класс Scanner будет блокироваться всякий раз, когда используется InputStream для его блокировки. Обычно он не блокируется при чтении из файла, поскольку его содержимое легко доступно (т. Е. inputStream.available() > 0), они все-таки на вашем компьютере. Однако, если вы создаете Scanner, используя InputStream, который может потребовать ожидание поступления данных (например, чтение текста с удаленного клиента, ожидание загрузки страницы, чтобы вы могли прочитать его источник и т. Д.), Тогда Scanner#nextLine() будет блокироваться, потому что он необходимо подождать достаточно информации, чтобы построить следующую строку.

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