我用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阶段启动时,它似乎仍然在运行并且没有停止。我想杀死它,这样当我想开始一个新线程时就不会发生错误。
答案 0 :(得分:3)
这不是线程问题,而是服务器套接字问题。 TCP / IP不允许立即重新使用套接字,因为重新使用者可以看到针对旧用户的数据包。
有关如何重用套接字的信息,请参阅this question。