![](/img/trans.png)
[英]Socket not closing serverside when calling socket.close() in client JAVA
[英]Socket not closing when calling socket.close()
我在這篇文章中發現了相同的問題,但我認為它沒有解決。
我要簡短一點,這是我的代碼:
try {
Socket pacConx = new Socket(ip, Integer.parseInt(port));
DataInputStream dataIn = new DataInputStream(pacConx.getInputStream());
DataOutputStream dataOut = new DataOutputStream(pacConx.getOutputStream());
while(){...}
} catch (IOException e) {
logger.fatal("error", e);
}finally{
if (dataIn != null) {
dataIn.close();
}
if (dataOut != null) {
dataOut.close();
}
if (pacConx != null) {
pacConx.close();
}
}
首先,我使用上面的代碼連接到服務器,並且成功。 但是,當我嘗試在一段時間后重新連接到同一服務器和端口時,我無法重新連接。 顯然,第一個套接字在serverSide中仍然是“活動的”。
是解決我的問題的辦法嗎?
有沒有辦法我可以關閉另一個“活動”套接字?
嘗試
...
dataOut.flush();
dataOut.close();
...
粘貼錯誤消息或/和完整堆棧跟蹤。
您需要啟動有序的斷開連接。 在流上調用flush之后,然后在套接字上調用close之前,添加以下內容:
pacConx.shutdownInput();
pacConx.shutdownOutput();
這告訴遠端您已經完成,並允許其拆除端口,而不必等待確保沒有數據在傳輸中。
關閉套接字后大約2-4分鍾,它將在服務器上掛起,處於“ CLOSE_WAIT”狀態。 這是TCP / IP協議的正常部分,用於處理仍在網絡中徘徊的延遲數據包。
這應該由您的服務器代碼處理。 它在處理請求並嘗試在關閉后重新建立請求時是否解除其偵聽套接字的綁定? 如果是這樣,它應該在處理期間退出偵聽,或者使用SO_REUSEADDR選項重新建立它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.