繁体   English   中英

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

[英]Java: How to kill Server thread so that running the Server again will not cause “Address already in use”

我用一个GUI编写了一个服务器和一个客户端来在它们之间传输文本,它们运行良好。 我搜索谷歌“如何通过网络发送文件”然后我​​找到了这个美丽的解决方案(参见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阶段再次启动时,它似乎仍在运行并且没有停止。 我想要杀死它,以便当我想启动一个新线程时不会发生错误。

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

请参阅有关如何重用套接字的此问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM