【问题标题】:Cannot assign requested address using ServerSocket.socketBind无法使用 ServerSocket.socketBind 分配请求的地址
【发布时间】:2012-02-16 10:04:58
【问题描述】:

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

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。还有什么问题?

【问题讨论】:

  • BindException 的 javadoc 状态:表示尝试将套接字绑定到本地地址和端口时发生错误的信号。通常,端口正在使用中,或者无法分配请求的本地地址。你确定你的程序没有运行两次,第一个实例使用端口,第二个实例抛出异常,因为端口已经被第一个实例使用
  • 听起来您的服务器的另一个副本已经在运行(仔细检查任务管理器),或者您刚刚杀死了另一个版本的服务器并且套接字“徘徊”了一段时间。
  • 请参阅nirlevy.blogspot.co.il/2007/12/…“无法分配请求的地址”意味着(在您的情况下)“localhost”可能没有映射到有效的 IP。

标签: java sockets jvm bind


【解决方案1】:

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

【讨论】:

  • 在 hosts 文件中添加此配置节省了我的一天 127.0.0.1 localhost 。谢谢!
  • 啊,谢谢伙计。 :)
【解决方案2】:

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

netstat -a -n | grep "LIST"

它应该列出所有占用端口的东西。当然,您必须在任务管理器中手动杀死这些程序。如果这仍然不起作用,请替换以下行:

serverSocket = new ServerSocket(9999);

与:

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

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

【讨论】:

  • 感谢 anwsers,但在发布之前,我已确保没有任何东西阻止端口 9999。重新启动我的电脑后,出现同样的错误。
  • 是的。我运行的所有东西都会自动获得提升的权限。
  • 是的,命令行正在以管理员权限运行。我正在使用“java -jar SocketServer.jar”命令。
  • 有人能解释一下,为什么第二种形式不同/更好?
  • 这是不正确的。如果端口被另一个进程占用,则错误将是“java.net.BindException:地址已在使用中”。错误“java.net.BindException:无法分配请求的地址”问题是因为您尝试在无效 IP 地址上打开套接字。
【解决方案3】:

仅对于可能会查看此答案以希望解决类似问题的其他人,我收到了类似的消息,因为我的 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)

【讨论】:

  • 我也一样。 ipaddress 已更改。
  • 谢谢你,如果我没有读到这篇文章,我会试图弄清楚这一点多年。
  • 对我来说问题是以前的 IP 地址仍在 etc/hosts 中
【解决方案4】:

错误为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.

    【讨论】:

    • 这是一个与问题不同的错误。
    • 问题是关于“无法分配请求的地址”的错误消息。该错误消息与您的答案说明或解决的错误消息不同。
    • 这应该是公认的答案。 “无法分配请求的地址错误”是由于操作系统无法解析“localhost”,这是启动和关闭服务器所必需的。这通常是由错误配置的主机文件引起的。此错误并非特别是由于端口正在使用。我从我的 /etc/hosts 文件中评论了除此“127.0.0.1 localhost”之外的所有条目,以解决与我的 tomcat 应用程序类似的问题。
    • 此解决方案不正确。 localhost 必须映射到 127.0.0.1, and the 'real' IP address must map to a hostname other than localhost`。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      对我来说,这是因为之前的 jmeter.properties 更改仍在进行中

      httpclient.localaddress=12.34.56.78
      

      【讨论】:

        【解决方案8】:

        就我而言: 只需重新启动我的计算机,之后一切正常。

        【讨论】:

          【解决方案9】:

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

          netstat -a -n -o

          查询左侧列中正在使用的端口 9999 的输出。

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

          【讨论】:

          • 由于错误状态,地址不可用,这意味着端口完全无关。
          • 这是不正确的。如果端口被另一个进程占用,则错误将是“java.net.BindException:地址已在使用中”。错误“java.net.BindException:无法分配请求的地址”问题是因为您尝试在无效 IP 地址上打开套接字。
          【解决方案10】:

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

          • 127.0.0.1 本地主机
          • 192.168.100.20 localhost

          【讨论】:

            【解决方案11】:

            我在将配置从一台服务器复制到另一台服务器时遇到了这个错误。

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

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

            【讨论】:

              【解决方案12】:

              如果你发生在 CentOS 上?

              你应该试试这个。

              $服务网络重启

              重启你的服务器。

              【讨论】:

                【解决方案13】:

                我的笔记本电脑在网络中有一个内部 DNS 名称,它一直很好,直到 某事 然后坏了。

                为了解决这个问题,我添加了一行通过 DNS 名称将所有请求路由到我的 127.0.0.1,我的 /etc/hosts 看起来像这样:

                127.0.0.1       localhost
                127.0.0.1       host.docker.internal
                127.0.0.1       my-url.box #added for the problem
                

                可能与某人有关。

                很容易调试,只要运行一个类,直到它变成绿色:

                public static void main(String[] args) throws Exception {
                        new ServerSocket(0, 1, InetAddress.getLocalHost());
                    }
                

                【讨论】:

                  【解决方案14】:

                  端口被另一个进程占用。可能是您的程序未终止的旧运行。确保您的程序已干净退出或将其终止。

                  【讨论】:

                  • 不可能!我刚刚重新启动了我的电脑,它没有帮助。
                  • 这是不正确的。如果该端口被另一个进程占用,则错误将是“java.net.BindException:地址已在使用中”。错误“java.net.BindException:无法分配请求的地址”问题是因为您尝试在无效 IP 地址上打开套接字。
                  【解决方案15】:

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

                  根据BindException文档,基本上是:

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

                  所以试试下面的命令:

                  sudo lsof -i:8983
                  

                  仔细检查是否有任何应用程序正在使用相同的端口并将其终止。

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

                  【讨论】:

                  • 这是不正确的。如果端口被另一个进程占用,则错误将是“java.net.BindException:地址已在使用中”。错误“java.net.BindException:无法分配请求的地址”问题是因为您尝试在无效 IP 地址上打开套接字。
                  • @dan.mwasuser2321368 感谢您的建议,我已经改进了我的答案,请检查我的编辑。
                  猜你喜欢
                  • 2021-11-03
                  • 2013-08-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多