【问题标题】:Java Socket, binding to local portJava Socket,绑定到本地端口
【发布时间】:2013-01-19 21:22:58
【问题描述】:

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

【问题讨论】:

  • 为什么要关心出站本地端口是什么?
  • @Brian Roach 我正在限制特定端口的带宽以用于研究目的。为了让它工作,我需要知道我的应用程序的某些部分正在使用哪些端口。
  • 我相信您必须绑定到实际的出站 IP 地址(不是将解析为 127.0.0.1 的 localhost) - 不过我必须对其进行测试。

标签: java sockets client port socketexception


【解决方案1】:

您必须绑定到您机器的外部(出站)IP 地址,而不是本地主机 (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 专用网络地址。

【讨论】:

  • 谢谢布赖恩,我刚刚测试了它,它可以工作。抱歉,我没有足够的声誉来支持您的回答。
  • HELLO @BrianRoach 我们不应该绑定并连接到同一个 InetSocketAddress 即服务器?就像我们需要绑定到一个套接字地址并连接到另一个?我有点困惑。你能澄清一下吗
【解决方案2】:

Brian 的回答在确定问题时很准确。

但是,您不需要出站接口的 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));

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 2015-11-19
    • 2012-07-24
    • 2019-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2011-12-31
    相关资源
    最近更新 更多