Закрытие сокета не вызывает IOException - PullRequest
2 голосов
/ 22 сентября 2011

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

public void run() {
    while(alive) {
        try {
            // socketIn is a BufferedReader wrapped around the socket's InputStream.
            String input = socketIn.readLine();
            if(input == null)
                continue;
            String response = processInput(input);
            // socketOut is a PrintWriter wrapped around the socket's OutputStream.
            if(response != null) {
                socketOut.println(response);
                socketOut.flush();
            }
        } catch(IOException e) {
            System.out.println("TRACE 1");
            alive = false;
        }
    }
    System.out.println("TRACE 2");
}

Но когда я убиваю клиента, цикл продолжает идти, и ни TRACE не распечатывается. Я предполагаю, что когда сокет закрывается с другого конца, и я пытаюсь прочитать с него, он выдаст IOException.

Это было плохое предположение? Что я могу сделать, чтобы это исправить?

1 Ответ

4 голосов
/ 22 сентября 2011

readLine() вернет null в конце потока, что происходит, когда удаленный конец обычно закрывает соединение. Вы пытаетесь continue выполнить это условие, которое будет повторяться бесконечно. IOException будет сброшено, если соединение нарушено ненормально.

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