我正在尝试将客户端上的Socket绑定到任何特定的本地端口,在此代码中我使用了20000。
如下所示的正常连接可以正常工作。但是不允许我选择本地端口。
hostSocket = new Socket(host,80);
所以我尝试了这个:
hostSocket = new Socket(host, 80, InetAddress.getLocalHost(), 20000);
和此:
hostSocket = new Socket();
hostSocket.bind(new InetSocketAddress("localhost", 20000));
hostSocket.connect(new InetSocketAddress(host,80));
但他们都给我留下了这个例外......在第二种情况下,连接调用发生了异常。我不太确定我缺少什么,我会喜欢一些指针。
java.net.SocketException: Invalid argument or cannot assign requested address
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
at java.net.Socket.connect(Socket.java:546)
at java.net.Socket.connect(Socket.java:495)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.connect(NetflixPrefetchingAgent.java:98)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.run(NetflixPrefetchingAgent.java:164)
at java.lang.Thread.run(Thread.java:679)
Exception in thread "Thread-19" java.lang.NullPointerException
at com.mb.proxy.netflix.NetflixPrefetchingAgent.prefetchChunk(NetflixPrefetchingAgent.java:272)
at com.mb.proxy.netflix.NetflixPrefetchingAgent.run(NetflixPrefetchingAgent.java:176)
at java.lang.Thread.run(Thread.java:679)
答案 0 :(得分:33)
您必须绑定到计算机的外部(出站)IP地址,而不是localhost(127.0.0.1)。
以下内容适用于我的包装盒:
Socket s = new Socket();
s.bind(new InetSocketAddress("172.16.1.102", 5000));
s.connect(new InetSocketAddress("google.com", 80));
其中172.16.1.102
是我的路由器通过DHCP分配给此方框的NAT专用网络地址。
答案 1 :(得分:2)
布莱恩的回答是确定问题的答案。
但是,您不需要出站接口的IP地址,因为您只需为“任何地址”指定0.0.0.0
即可。然后将自动选择正确的出站接口。这非常类似于先连接而没有绑定。
此外,easiest way to specify 0.0.0.0
as the address is to omit the parameter。
因此:
hostSocket = new Socket();
hostSocket.bind(new InetSocketAddress(20000));
hostSocket.connect(new InetSocketAddress(host, 80));