ServerSocket завершается с ошибкой при построении

#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);
}
  

Однако мое первоначальное предположение заключается в том, что порт уже используется, если вы уже сталкивались с проблемами брандмауэра.