Могу ли я иметь исключение ввода-вывода при создании серверного сокета в Java?
У меня есть следующий код:
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
Код взят с сайта java.sun.com.
У меня есть несколько вопросов, касающихся приведенной выше короткой части кода.
Почему мы хотим поймать IOException. Мне кажется, что IOException - это то, что может произойти, когда мы используем методы ввода-вывода (а не сетевые методы).
В чем разница между "System.err.println" и "System.println"?
В заявлении улова мы имеем "е". Зачем? Мы используем это позже?
3 ответа
1: Почему мы хотим поймать IOException. Мне кажется, что IOException - это то, что может произойти, когда мы используем методы ввода-вывода (а не сетевые методы).
Сеть также является входом / выходом. Байт потоков через сокет.
2: В чем разница между "System.err.println" и "System.println"?
Первый пишет в stderr, второй не существует.
3: в заявлении catch у нас есть "e". Зачем? Мы используем это позже?
Чтобы иметь ссылку на исключение, чтобы вы могли при необходимости войти или сбросить его.
(а) Вы не "создаете сокет сервера" в этом коде, вы принимаете сокет от ServerSocket.
(б) Это может привести к сбою по многим причинам, включая закрытие ServerSocket; истощение FDs; проблемы с сетевым стеком; истощение памяти;... так что выдает IOException.
Одной из распространенных причин принятия исключения IOException является отсутствие файловых дескрипторов. Для создания сокета требуются два дескриптора файла, и если у вас заканчивается, вы получаете сообщение об ошибке "Слишком много файлов открыто"