无法使用ServerSocket.socketBind分配请求的地址

问题描述 投票:43回答:13

[当我尝试设置套接字服务器时,出现错误消息:

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

整个代码可能是最简单的:

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

我100%确定端口已转发,Windows防火墙已关闭。什么都不会阻塞端口9999。还有什么地方会出错?

java sockets jvm bind
13个回答
17
投票

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

netstat -a -n | grep "LIST"

并且它应该列出任何阻塞端口的内容。当然,您必须去手动在Task Manager中杀死那些程序。如果仍然无法解决问题,请替换以下行:

serverSocket = new ServerSocket(9999);

使用:

InetAddress locIP = InetAddress.getByName("192.168.1.20");
serverSocket = new ServerSocket(9999, 0, locIP);

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


0
投票

就我而言,从/ etc / hosts中删除

  • 127.0.0.1本地主机
  • 192.168.100.20本地主机<<<< ----(删除或评论)

0
投票

我将配置从一台服务器复制到另一台服务器时遇到此错误。

我的$ {JETTY_BASE} /start.ini jetty.host属性中有旧主机的主机名。设置正确的jetty.host属性值可以为我解决问题。

希望这对将来必须同时在多台服务器上工作的人有所帮助。


0
投票

如果您在CentOS上发生过?

您应该尝试这样做。

$服务网络重启

重新启动服务器。


-3
投票

java.net.BindException:无法分配请求的地址

根据BindException文档,基本上是:

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

因此,请尝试以下命令:

sudo lsof -i:8983

仔细检查是否有任何应用程序正在使用相同的端口并杀死它。

如果不是这种情况,请确保您要绑定的IP地址正确(已正确分配给您的网络接口)。


30
投票

它可能与/etc/hosts中的错误配置有关。就我而言,就像这样:192.168.1.11 localhost代替127.0.0.1 localhost


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)

12
投票

错误显示为Cannot assign requested address。这意味着您需要为您的网络接口之一或0.0.0.0使用正确的地址来接受来自所有接口的连接。

关于端口的其他解决方案仅在有时无法解决的黑魔法之后才能起作用(例如,在某些计算机重新启动后才起作用,但在其他计算机不起作用之后,则因为端口完全不相关。


5
投票

java.net.BindExcpetion的Java文档,

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

原因:

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

解决方案:

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

例如:

#127.0.0.1 localhost
192.168.52.1 localhost

阅读更多:java.net.BindException : cannot assign requested address.


4
投票

对我来说是因为先前的jmeter.properties更改仍在起作用

httpclient.localaddress=12.34.56.78

4
投票

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


0
投票

该端口被另一个进程占用。可能是您的程序未终止的较早版本。确保您的程序干净退出或杀死它。


0
投票

由于错误状态,它无法绑定-通常表示它正在被另一个进程使用。从命令行运行:

netstat -a -n -o

查询在左栏中使用的端口9999的输出。

有关更多信息:http://www.zdnetasia.com/see-what-process-is-using-a-tcp-port-62047950.htm

© www.soinside.com 2019 - 2024. All rights reserved.