java.net.SocketException:无法解析的地址

时间:2018-10-30 13:12:49

标签: java tcp

我已经用Java实现了一个服务器应用程序,我正尝试在云中进行部署。我对这部分代码有疑问

serverSocket = ServerSocketChannel.open();
serverSocket.socket().bind(new InetSocketAddress(myHost,myPort));

设置String myHost = "localhost"时,一切正常。但是,我希望它与远程计算机的公共IP一起工作。我尝试了2种不同的方法

  1. String myHost = "10.0.0.4"(运行ifconfig时获得的Ip)。在这种情况下,我得到

    java.net.BindException: Cannot assign requested address
         at sun.nio.ch.Net.bind0(Native Method)
         at sun.nio.ch.Net.bind(Net.java:433)
         at sun.nio.ch.Net.bind(Net.java:425)
         at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
         at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
         at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67)
    
  2. String myHost = "publichost",然后在10.0.0.4 publichost文件中添加一行/etc/hosts/。在这种情况下,我得到

    java.net.SocketException: Unresolved address
        at sun.nio.ch.Net.translateToSocketException(Net.java:131)
        at sun.nio.ch.Net.translateException(Net.java:157)
        at sun.nio.ch.Net.translateException(Net.java:163)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:76)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67)
    

我做错了什么?

1 个答案:

答案 0 :(得分:1)

第一个错误(通常)表示您正在绑定到已在使用的IP +端口组合。

使用netstat -lntp列出在tcp端口上侦听的所有程序,并查找您要使用的端口。然后关闭程序...或选择其他端口。

这也可能意味着您完全使用了错误的IP。当您在服务器套接字上调用bind时,地址和端口应为您的应用程序希望接收传入连接的IP和端口。因此,该IP必须是该主机 的IP(不是远程主机)。请注意,您还可以使用0.0.0.0 ...,表示“此主机的所有IP地址”。

第二个错误可能意味着:

但是我怀疑如果您解决了“无法解析的地址”问题而未解决原始“无法分配所请求的地址”的原因,则后者会再次出现。您不需要DNS条目即可绑定服务器套接字!