#java #sockets #port
#java #сокеты #порт
Вопрос:
У меня есть следующая конструкция:
try {
serverSocket = new ServerSocket(port);
} catch (Exception e) {
throw new RuntimeException("Could not create server socket.");
}
и построение завершается с ошибкой, и я получаю сообщение «Не удалось создать серверный сокет». Порт всегда равен 8085. Я открыл как внешние, так и внутренние порты в моем брандмауэре (Windows 7). В чем может быть проблема?
Исключением является исключение IOException:
Исключение в потоке «main» java.lang.RuntimeException: не удалось создать серверный сокет. в cs236369.proxy.ProxyServer.(ProxyServer.java:23) в cs236369.proxy.ProxyServer.main(ProxyServer.java:62)
Запуск netstat -an
дает следующий результат:
TCP 0.0.0.0:8085 0.0.0.0:0 LISTENING
TCP [::]:8085 [::]:0 LISTENING
Трассировка стека:
java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at cs236369.proxy.ProxyServer.<init>(ProxyServer.java:21)
at cs236369.proxy.ProxyServer.main(ProxyServer.java:63)
Комментарии:
1. какое исключение является e? не могли бы вы, пожалуйста, распечатать это и опубликовать здесь?
2. является ли пользователь, с которым вы вошли в Windows, пользователем admin?
3. Я вошел в систему как единственный пользователь в системе, который является администратором.
4. Используется ли 8085 в настоящее время каким-либо другим процессом?
netstat -an
здесь помогло бы. И 1 за результаты e.printStackTrace() помогло бы.5. Перехват исключения для создания исключения звучит для меня как плохая практика.
Ответ №1:
Согласно API, исключение bindexexception
Сигнализирует о том, что произошла ошибка при попытке привязать сокет к локальному адресу и порту. Как правило, порт используется, или запрошенный локальный адрес не может быть назначен.
В принципе, этот порт мог использоваться другим процессом, даже, возможно, другим экземпляром того же приложения из-за некорректного завершения работы. Эта ссылка может помочь вам устранить неполадки.
Примечание:
Опубликованные результаты выполнения netstat -an
команды, похоже, подтверждают, что порт 8085 используется несколькими процессами, что привело бы к тому, BindException
с чем вы столкнулись.
Ответ №2:
Вы получите более подробную причину вашего исключения, если включите перехваченное исключение во вновь созданное исключение:
try {
serverSocket = new ServerSocket(port);
} catch (Exception e) {
throw new RuntimeException("Could not create server socket.", e);
}
Однако мое первоначальное предположение заключается в том, что порт уже используется, если вы уже сталкивались с проблемами брандмауэра.