在客户端服务器应用程序中动态选择连接端口

时间:2017-04-23 06:36:14

标签: java exception server client bind

我有一个客户端服务器应用程序。当多个客户端连接到指定端口上的服务器(例如6001)时,我遇到了问题。问题是当客户端连接到服务器并且如果我使用命令kill -9 $ pid(其中pid是服务器应用程序pid)的脚本停止服务器,那么在重新启动服务器时我得到一个BIND异常 - 地址已经在使用这意味着由于客户端无法连接到服务器,端口6001仍然无法再次连接客户端。

我一直在寻找解决这个问题的方法。我想到了动态使用端口范围。

以下是我的想法:

在Xml文件中,而不是将端口号硬编码为6001.我将提供一系列端口,例如6001-6005。然后,当服务器启动时,它将循环通过端口以选择可用端口。例如,当服务器尝试创建绑定到指定端口6001的服务器套接字时,如果存在异常,如果该端口已被另一个应用程序绑定,则它将选择6002端口,依此类推。无论哪个端口可用,服务器都会为它创建服务器Socket对象,并开始侦听该端口上的客户端。

现在类似地在客户端它将首先尝试连接6001,如果失败然后6002,依此类推,直到它连接到服务器正在监听的正确端口。

我的问题是,这是否是正确的方法。此外,如果客户端可以以上述方式连接。

如果不是,那么有没有办法解决我上面提到的问题。

2 个答案:

答案 0 :(得分:1)

您需要创建ServerSocket

ServerSocket ss = new ServerSocket(); // NB no parameters
ss.setReuseaddress(true);
ss.bind(new InetSocketAddress(port));

这告诉操作系统即使在TIME-WAIT状态下存在剩余连接,也可以绑定服务器套接字。如果仍有应用程序的先前实例正在运行,当然您需要先停止它。

忘记端口范围的东西。

答案 1 :(得分:0)

要查找使用端口的进程的pid,请使用

lsof -wni tcp:portnumber

然后使用pid终止进程,这将释放端口以供进一步使用,并且它不会给出"已经进入"使用错误。这将解决您的问题。更好的做法是有一个端口供客户端访问。