【发布时间】:2017-04-23 06:36:14
【问题描述】:
我有一个客户端服务器应用程序。当多个客户端连接到指定端口(例如 6001)上的服务器时,我遇到了问题。问题是当客户端连接到服务器时,如果我使用带有命令 kill -9 $pid 的脚本(其中 pid 是服务器应用程序 pid)停止服务器,那么在重新启动服务器时,我得到一个 BIND Exception- Address already in使用这意味着端口 6001 仍然无法供客户端再次连接,因为客户端无法连接到服务器。
我一直在寻找解决此问题的方法。我有一个想法是动态使用端口范围。
这是我的想法:
在 XML 文件中,而不是将端口号硬编码为 6001。我将提供一系列端口,例如 6001-6005。然后,当服务器启动时,它将遍历端口以选择可用端口。例如——当服务器尝试创建绑定到指定端口6001的服务器套接字时,如果出现异常,如果该端口已经被另一个应用程序绑定,那么它将选择6002端口等等。无论哪个端口可用,服务器都会为其创建服务器 Socket 对象并开始侦听该端口上的客户端。
现在同样在客户端,它会首先尝试连接 6001,如果失败则连接 6002,依此类推,直到它连接到服务器正在侦听的正确端口。
我的问题是这是否是正确的方法。此外,如果客户端可以以上述方式连接。
如果没有,那么有什么办法可以解决我上面提到的问题。
【问题讨论】:
-
如果您成功终止程序,端口应该可用。您的代码是否启动了处理传入连接的子进程?如果是,该子进程是否仍在运行?
-
好吧,我不确定是否还有其他进程正在运行。我怎样才能找到那个?我的服务器在 Solaris 上运行。该问题不会在 linux 上复制,也不会在 windows 上复制。你能提供一个可以杀死所有进程的命令,包括子进程吗?以下是我停止服务器时运行的命令。 # # 关闭服务器 # kill_server() { pid=
server_pidif [ "$pid" != "" ] ;然后 /bin/kill -9 $pid echo 服务器停止。否则回显服务器未运行。 }
标签: java exception server client bind