簡體   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