#java #sockets #timeout #java.util.scanner
#java #сокеты #тайм-аут #java.util.scanner
Вопрос:
Я хотел установить тайм-аут при чтении клиентом. предполагалось, что подпрограмма должна выдавать исключение InterruptedIOException, но вместо этого она выдает исключение NoSuchElementException на System.out.println("echo: " _in.nextLine());
что я делаю не так?
это мой метод
public void startUserInput()
{
try {
_out = new PrintWriter(_echoSocket.getOutputStream(), true);
_in = new Scanner(new InputStreamReader(_echoSocket.getInputStream()));
Scanner stdIn = new Scanner(new InputStreamReader(System.in));
System.out.print("Input: ");
while (stdIn.hasNextLine()) {
_out.println(stdIn.nextLine());
System.out.println("echo: " _in.nextLine());
System.out.print("Input: ");
}
stdIn.close();
}catch (InterruptedIOException exception){
System.err.println("The server is not responding " _serverHostname);
}
catch (IOException e) {
System.out.println("error" e.getLocalizedMessage());
}}
и это мое соединение
public boolean establishConnection()
{
System.out.println ("Connecting to the host "
this.getServerHostname() " au port " this.getServerPort());
try {
_echoSocket = new Socket();
_echoSocket = new Socket(this.getServerHostname(), this.getServerPort());
_echoSocket.setSoTimeout(10000);
System.out.println(_echoSocket.getOutputStream());
return _echoSocket.isConnected();
} catch (UnknownHostException e) {
System.err.println("Unknown host: " this.getServerHostname());
return false;
} catch (IOException e) {
System.err.println("Error while connecting to the server : "
this.getServerHostname() ":" this.getServerPort());
return false;
}
}
Спасибо
Ответ №1:
Причина в том, что при вызове _in.nextLine()
нет строки для чтения из из объекта сканера _in.
Что вы сделали в цикле while, так это проверили, stdIn.hasNextLine()
но вы не проверили, _in
есть ли nextLine(), который можно прочитать.
Для получения подробной информации об исключении, вы можете проверить:
http://download.oracle.com/javase/1,5.0/docs/api/java/util/Scanner.html#nextLine()
надеюсь, это поможет 🙂 Приветствия!
Комментарии:
1. Использование условия ‘hasNextLine()’ перед чтением _in не привело ни к исключению NoSuchElementException, ни к исключению InterruptedIOException
2. Я думаю, что я собираюсь обработать исключение тайм-аута внутри исключения NoSuchElementException, если у вас нет лучшего решения 🙂
3. ‘hasNextLine()’ не вызывает исключение NoSuchElementException. Это вызовет исключение IllegalStateException, если сканер закрыт. Вероятно, вам следует проверить с помощью: _in.hasNextLine(), прежде чем вызывать _in.nextLine() . Надеюсь, это поможет 🙂