Могу ли я получить исключение ввода-вывода при создании серверного сокета на Java? - PullRequest
1 голос
/ 21 февраля 2010

У меня есть следующий код:

Socket clientSocket = null;
try {
   clientSocket = serverSocket.accept();
} catch (IOException e) {
   System.err.println("Accept failed.");
   System.exit(1);
}

Код взят из java.sun.com .

У меня есть несколько вопросов, касающихся приведенной выше короткой части кода.

  1. Почему мы хотим поймать IOException. Я думаю, что IOException - это то, что может произойти, когда мы используем методы ввода-вывода (а не сетевые методы).

  2. В чем разница между "System.err.println" и "System.println"?

  3. В операторе catch у нас есть "e". Зачем? Мы используем его позже?

Ответы [ 3 ]

6 голосов
/ 21 февраля 2010

1: Почему мы хотим поймать IOException. Я думаю, что IOException - это то, что может произойти, когда мы используем методы ввода-вывода (а не сетевые методы).

Сеть также является входом / выходом. Потоки байтов через сокет.

2: В чем разница между "System.err.println" и "System.println"?

Первый пишет в stderr , второй не существует.

3: в операторе catch мы имеем «e». Зачем? Мы используем это позже?

Чтобы иметь ссылку на исключение, чтобы вы могли при необходимости записать или выбросить его.

1 голос
/ 22 февраля 2010

(a) Вы не «создаете сокет сервера» в этом коде, вы принимаете сокет от ServerSocket.

(b) Это может дать сбой по многим причинам, включая закрытие ServerSocket; истощение FDs; проблемы с сетевым стеком; истощение памяти; ... так что выдает IOException.

0 голосов
/ 22 февраля 2010

Одной из распространенных причин принятия исключения IOException является отсутствие файловых дескрипторов. Для создания сокета требуются два дескриптора файла, и если у вас закончилась ошибка, вы получите сообщение типа «Слишком много файлов открыто»

...