Java:如何杀死服务器线程,以便再次运行服务器不会导致"地址已在使用"

时间:2013-02-08 07:57:29

标签: java multithreading sockets

我用GUI编写了一个服务器和一个客户端来在它们之间传输文本,它们运行良好。我搜索了谷歌“如何通过网络发送文件”,然后我找到了this漂亮的解决方案(参见Andrey Kozhanov的回复)。我将链接中的服务器类移动到我的服务器包中,并将链接中的客户端类移动到我的客户端包中以尝试它们运行良好。现在我可以发送即时文本消息和即时文件。

我写了一切必要的东西,使沟通顺利进行,以满足用户的期望。

问题在特定情况下会出现问题。

两台服务器有不同的端口号; (我的文字和文件链接中的文字)
第1阶段
1-客户端请求服务器发送文件 2-服务器回复()(对话是 - 否选项)。
3-客户端导航文件选择器的列表 4-客户端取消文件选择器(未发送文件) 5-服务器通知客户取消 第2阶段
- 再次
1-客户端请求服务器发送文件 2-服务器回复()。服务器端出现错误;

错误的第一行是:

  

java.net.BindException:已在使用的地址:JVM_Bind

我在服务器包中开始接收线程,如此

        recieverThread = new Recieving();
        recieverThread.setDaemon(true);
        recieverThread.start();

问题追溯到阶段1 数字5(5-服务器通知客户端取消。)。因为用于从客户端接收文件的服务器线程启动,所以在第5点我必须停止它。停止这个线程我使用

的组合
        recieverThread.interrupt();
        recieverThread = null;

但是当它再次在第2阶段启动时,它似乎仍然在运行并且没有停止。我想杀死它,这样当我想开始一个新线程时就不会发生错误。

1 个答案:

答案 0 :(得分:3)

这不是线程问题,而是服务器套接字问题。 TCP / IP不允许立即重新使用套接字,因为重新使用者可以看到针对旧用户的数据包。

有关如何重用套接字的信息,请参阅this question