无法分配请求的地址:JVM_Bind

Adr*_*zyk 44 java sockets jvm bind

当我尝试设置套接字服务器时,我收到一条错误消息:

Exception in thread "main" java.net.BindException: Cannot assign requested address: JVM_Bind
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383)
    at java.net.ServerSocket.bind(ServerSocket.java:328)
    at java.net.ServerSocket.<init>(ServerSocket.java:194)
    at java.net.ServerSocket.<init>(ServerSocket.java:106)
    at socketyserver.SocketyServer.main(SocketyServer.java:12)
Java Result: 1
Run Code Online (Sandbox Code Playgroud)

整个代码最简单,因为它可以是:

public static void main(String[] args) throws UnknownHostException, IOException
{
    ServerSocket serverSocket;
    serverSocket = new ServerSocket(9999);
}
Run Code Online (Sandbox Code Playgroud)

我100%确定我的端口已转发,Windows防火墙已关闭.什么都没有阻止端口9999.还有什么可能出错?

小智 30

它可能与一个配置错误在你的/etc/hosts.在我的情况下,它是这样的: 192.168.1.11 localhost而不是127.0.0.1 localhost

  • 我在 /etc/hosts 中有 `127.0.0.1 localhost`,但我仍然收到错误(macOS Monterey)。 (2认同)

Mar*_*nto 17

正如其他人所指出的那样,它很可能与另一个使用端口的进程有关9999.在Windows上,运行命令:

netstat -a -n | grep "LIST"
Run Code Online (Sandbox Code Playgroud)

它应该列出那些占据港口的东西.当然,您必须在任务管理器中手动终止这些程序.如果仍然无效,请更换以下行:

serverSocket = new ServerSocket(9999);
Run Code Online (Sandbox Code Playgroud)

附:

InetAddress locIP = InetAddress.getByName("192.168.1.20");
serverSocket = new ServerSocket(9999, 0, locIP);
Run Code Online (Sandbox Code Playgroud)

当然要替换192.168.1.20为您的实际IP地址,或使用127.0.0.1.

  • 这是不正确的.如果端口被另一个进程占用,则错误将是"java.net.BindException:Address in in use".错误"java.net.BindException:无法分配请求的地址"问题是因为您尝试在无效的IP地址上打开套接字. (12认同)
  • 感谢你们,但在发布之前,我确保没有任何东西阻止了9999号端口.重新启动电脑后出现了同样的错误. (4认同)

cqu*_*zel 15

对于那些可能会看到这个答案希望解决类似问题的人,我收到了类似的消息,因为我的IP地址发生了变化.

java.net.BindException: Cannot assign requested address: bind
    at sun.nio.ch.Net.bind(Native Method)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:126)
    at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.open(SelectChannelConnector.java:182)
    at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:311)
    at org.eclipse.jetty.server.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:260)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
    at org.eclipse.jetty.server.Server.doStart(Server.java:273)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,如果我不读这篇文章,我会设法弄清楚这一点。 (2认同)

Ola*_*the 13

错误说Cannot assign requested address.这意味着您需要为您的某个网络接口使用正确的地址或0.0.0.0接受来自所有接口的连接.

关于端口的其他解决方案仅在有时失败的黑魔法之后工作(例如在一些计算机重启后工作但不在其他计算机重启之后)因为端口完全无关紧要.


Luc*_*cky 6

Java文档java.net.BindExcpetion,

表示尝试将套接字绑定到本地地址和端口时发生错误的信号.通常,端口正在使用中,或者 无法分配请求的本地地址.

原因:

该错误是由于上述第二个条件造成的.当您启动服务器(Tomcat,Jetty等)时,它会侦听端口并将套接字绑定到地址和端口.在Windows和Linux中,主机名被解析为IP地址从此/etc/hosts主机到IP地址映射文件可以在C:\Windows\System32\Drivers\etc\hosts.如果更改此映射并且无法将主机名解析为IP地址,则会收到错误消息.

解:

编辑hosts文件并使用管理员权限更正主机名和IP的映射.

例如:

#127.0.0.1 localhost
192.168.52.1 localhost
Run Code Online (Sandbox Code Playgroud)

阅读更多:java.net.BindException:无法分配请求的地址.


Nic*_*ian 5

如果您使用的是服务器,则有“公共网络IP”和“内部网络IP”。在文件/ etc / hosts中使用“内部网络IP”,在代码中使用“公共网络IP”。如果您在文件/ etc / hosts中使用“公共网络IP”,则会出现此错误。

  • 谢谢,我正面临这个问题,您的提示救了我! (2认同)