【发布时间】:2013-01-27 15:22:21
【问题描述】:
我有一个服务器代码尝试根据给定的端口范围获取空闲端口 -
private ServerSocket allocatePort() throws IOException {
ServerSocket server = null;
for (int i=0; i<serverPortRange; i++) {
int port = serverPort.intValue()+i;
try {
server = new ServerSocket(port);
break;
} catch (IOException e) {
log.debug(String.format("DCServer could not allocate port %s", port));
}
}
if (server == null) {
throw new IOException();
}
return server;
}
当两台服务器在同一台机器上运行此代码时,它们会以某种方式获得相同的端口。我用netstat查看了是否真的获取到了,在占用端口列表中没有看到。
有什么想法吗?
谢谢, 关门
【问题讨论】:
-
将代码中的第 6 行替换为以下 3 行: server = new ServerSocket(); server.setReuseAddress(true); server.bind(new InetSocketAddress("127.0.0.1", port));简单地使用 new ServerSocket(port) 在 JRE 版本和操作系统平台上不是很稳定。
-
谢谢,我尝试了你的建议,但仍然没有限制端口。
-
两个客户端是否同时运行此代码?如果是,那么没有任何一个客户端在日志中记录错误吗?因为同一台机器上的两个 ServerSocket 不能同时绑定到同一个端口。
-
为什么客户端需要监听端口?那是为服务器准备的。
-
设置reuseAddress=true与问题的表达意图相反,所以这不是一个答案。其余的都是废话。除非您想限制谁可以连接,否则不需要绑定到 127.0.0.1,这在问题中也没有提到,并且绑定到默认的 INADDR_ANY 非常“稳定”,这与您的说法相反。 -1