[英]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.