我已经用Java实现了一个服务器应用程序,我正尝试在云中进行部署。我对这部分代码有疑问
serverSocket = ServerSocketChannel.open();
serverSocket.socket().bind(new InetSocketAddress(myHost,myPort));
设置String myHost = "localhost"
时,一切正常。但是,我希望它与远程计算机的公共IP一起工作。我尝试了2种不同的方法
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)
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)
我做错了什么?
答案 0 :(得分:1)
第一个错误(通常)表示您正在绑定到已在使用的IP +端口组合。
使用netstat -lntp
列出在tcp端口上侦听的所有程序,并查找您要使用的端口。然后关闭程序...或选择其他端口。
这也可能意味着您完全使用了错误的IP。当您在服务器套接字上调用bind
时,地址和端口应为您的应用程序希望接收传入连接的IP和端口。因此,该IP必须是该主机 的IP(不是远程主机)。请注意,您还可以使用0.0.0.0
...,表示“此主机的所有IP地址”。
第二个错误可能意味着:
但是我怀疑如果您解决了“无法解析的地址”问题而未解决原始“无法分配所请求的地址”的原因,则后者会再次出现。您不需要DNS条目即可绑定服务器套接字!