【问题标题】:Java DatagramSocket bind to two consecutive open portsJava DatagramSocket 绑定到两个连续的开放端口
【发布时间】:2017-10-12 02:03:17
【问题描述】:

我正在尝试在相邻端口上初始化两个 DatagramSocket:

int iport = 5000;
DatagramSocket sock1 = new DatagramSocket(iport);
DatagramSocket sock2 = new DatagramSocket(iport + 1);

但是,如果端口 5000 或 5001 不可用,则会失败。我不在乎绑定到哪些端口,只要它们满足sock1.getPort() + 1 == sock2.getPort() 的条件即可。有没有一种简单的方法可以找到两个相邻的端口,而无需遍历所有可用端口并尝试绑定到每个端口,直到找到两个可用的端口?

【问题讨论】:

  • 您可能想要选择尚未为其他协议保留的端口:Service Name and Transport Protocol Port Number Registry.
  • 为什么?这个要求是完全不切实际的。如果你不关心它们是什么,你为什么关心它们是相邻的?为什么你需要两个插座?
  • 我正在与一台服务器通信,无论出于何种原因,该服务器都会向比我发送的端口高一号的端口发送响应。没有多大意义,但我无权访问服务器代码...

标签: java sockets networking port


【解决方案1】:

DatagramSocket() 让操作系统为您选择一个空闲端口,而DatagramSocket(port) 尝试获取特定端口。

所以你可以这样做:

DatagramSocket sock1 = null;
DatagramSocket sock2 = null;

while (sock2 == null) {
    sock1 = new DatagramSocket();
    try {
        sock2 = new DatagramSocket(sock1.getLocalPort() + 1);
    } catch (java.net.BindException ex) {
        sock1.close();
    }
}

while 循环在这里是因为 sock1 的端口 + 1 已经绑定的可能性很小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多