10

我正在尝试将客户端的 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)
4

2 回答 2

34

您必须绑定到机器的外部(出站)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 专用网络地址在哪里。

于 2013-02-05T02:51:12.930 回答
3

布赖恩的回答在确定问题时很准确。

但是,您不需要出站接口的 IP 地址,因为您可以简单地0.0.0.0为“任何地址”指定。然后将自动选择正确的出站接口。这很像您在没有先绑定的情况下进行连接。

此外,指定0.0.0.0为地址的最简单方法是省略参数

所以:

hostSocket = new Socket();
hostSocket.bind(new InetSocketAddress(20000));
hostSocket.connect(new InetSocketAddress(host, 80));
于 2018-03-31T15:26:54.463 回答