首页 文章

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

提问于
浏览
0

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

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

这就是我的想法:

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

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

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

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

2 回答

  • 1

    你需要创建你的 ServerSocket

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

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

    忘记端口范围的东西 .

  • 0

    查找使用端口的进程的pid

    lsof -wni tcp:portnumber

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

相关问题