在Java中,我需要获取一个端口号,以便在同一程序的多个实例之间进行通信。 现在,我可以简单地选择一些固定数字并继续使用它。但我想知道是否有办法动态选择端口号,这样我就不必为设置端口号而烦扰我的用户。
这是我的一个想法,其效果如下:
这种策略有意义吗?或者有更好的方法来动态选择端口号吗?
答案 0 :(得分:28)
如果绑定到端口0,Java将使用系统生成的端口。 :-)所以,如果您已经使用了所需的端口,这可能是最简单的方法。
ServerSocket s = new ServerSocket(0);
int port = s.getLocalPort(); // returns the port the system selected
答案 1 :(得分:3)
我会反过来为您的应用选择一个固定的高端口。使其成为配置值,以便在必要时进行更改。这将简化配置,因为应用程序的用户经常需要请求网络操作来打开端口。解决IANA指定的值:
http://www.iana.org/assignments/port-numbers
扫描端口可能会使您的应用成为许多入侵检测系统的坏公民。
答案 2 :(得分:1)
您可以使用Bonjour / ZeroConf来宣传每个实例的服务,并启用实例来查找其他实例。可以将其视为目录服务,它可以帮助您管理端口名称空间。
在这种情况下,每个实例都可以抓取一个动态分配的端口。绑定到端口“0”的请求通常会指示系统分配动态端口。