动态选择端口号?

在Java中,我需要获取一个端口号,以便在同一程序的多个实例之间进行通信。 现在,我可以简单地选择一些固定数字并继续使用它。 但我想知道是否有一种方法可以动态选择端口号,这样我就不必为设置端口号而烦扰我的用户。

这是我的一个想法,它的工作原理如下:

  • 有一个固定的初始端口号A.
  • 程序’MyApp’启动,试图抓住端口A.
  • 如果成功,那么它就是’MyApp’的第一个实例。 完成。
  • 如果失败,它会通过端口A询问A上的程序是否是“MyApp”的实例。 如果是,请与该实例通信。 完成。 如果没有,请尝试抓住端口A + 1。 如果有另一个使用该端口的程序(也不是’MyApp’的实例),则抓A + 2,然后抓A + 3,依此类推。

这种策略有意义吗? 或者有更好的方法来动态选择端口号吗?

如果绑定到端口0,Java将使用系统生成的端口。 :-)所以,如果您已经使用了所需的端口,这可能是最简单的方法。

ServerSocket s = new ServerSocket(0); int port = s.getLocalPort(); // returns the port the system selected 

我会采取反过来为您的应用程序选择一个固定的高端口。 使其成为配置值,以便在必要时进行更改。 这将简化配置,因为应用程序的用户经常需要请求网络操作来打开端口。 解决IANA分配的值:

http://www.iana.org/assignments/port-numbers

扫描端口可能会使您的应用成为许多入侵检测系统的坏公民。

您可以使用Bonjour / ZeroConf来通告每个实例的服务,并使实例能够找到其他实例。 可以将其视为可以帮助管理端口命名空间的目录服务

在这种情况下,每个实例都可以抓取动态分配的端口。 绑定到端口“0”的请求通常会指示系统分配动态端口。