【问题标题】:How do you specify a port range for Java sockets?如何为 Java 套接字指定端口范围?
【发布时间】:2008-09-22 15:26:11
【问题描述】:

在 Java 中,您可以将数字零作为 Socket 或 DatagramSocket 构造函数的单个参数。然后 Java 将该 Socket 绑定到一个空闲端口。是否可以将端口查找限制在特定范围内?

【问题讨论】:

  • 好吧,对于非特权用户,它在 *nix 上已经限制为 >1024:P
  • 不幸的是我们在 windows 上运行 ;)

标签: java tcp sockets udp


【解决方案1】:

Hrm,在阅读文档后,我认为您不能。您可以绑定到任何端口,如果不可接受则重新绑定,或者重复绑定到您范围内的端口,直到成功。第二种方法将是最“有效”的。

我对这个答案感到不安,因为它......不雅,但我真的找不到其他任何东西:/

【讨论】:

  • 您还应该注意,在对空闲端口进行线性搜索时,有时会存在安全隐患。如果您将端口 A 用于客户端 1,将端口 A+1 用于下一个客户端,则客户端 1 可以猜测您将要用于其他客户端的端口。
【解决方案2】:

将套接字绑定到任何空闲端口(通常)是操作系统套接字支持的一个特性;它不是特定于 java 的。例如,Solaris 支持通过 ndd 命令调整临时端口范围。但是只有 root 可以调整范围,它会影响整个系统,而不仅仅是你的程序。

如果常规的临时绑定行为不适合您的需要,您可能必须使用 Socket.bind() 编写自己的。

【讨论】:

    【解决方案3】:

    这是您需要的代码:

    public static Socket getListeningSocket() {
        for ( int port = MIN_PORT ; port <= MAX_PORT ; port++ )
        {
            try {
                ServerSocket s = new ServerSocket( port );
                return s;      // no exception means port was available
            } catch (IOException e) {
                // try the next port
            }
        }
        return null;   // port not found, perhaps throw exception?
    }
    

    【讨论】:

    • 你应该捕获 BindException,它是在端口已被使用时启动的。
    【解决方案4】:

    您可能会看一下实现您正在使用的函数的 java 代码。大多数 Java 库都是用 Java 编写的,因此您可能只是在其中看到了您需要的内容。

    假设@Kenster 是正确的并且这是一个系统操作,您可能必须简单地迭代端口以尝试绑定到每个端口或对其进行测试。虽然有点痛苦,但应该不会超过几行代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      相关资源
      最近更新 更多