Могу ли я иметь исключение ввода-вывода при создании серверного сокета в Java?

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

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. В заявлении улова мы имеем "е". Зачем? Мы используем это позже?

3 ответа

Решение

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам