Исключение NoSuchElementException при установке тайм-аута в сокете

#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() . Надеюсь, это поможет 🙂