1

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

我写了所有必要的东西,以使通信顺利进行以满足用户的期望。

问题是问题发生在特定场景中。

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

错误的第一行是:

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

我像这样在 Server 包中开始接收线程

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

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

        recieverThread.interrupt();
        recieverThread = null;

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

4

1 回答 1

3

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

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

于 2013-02-08T08:08:17.403 回答