2012-11-27 36 views
1

本質上,我有一個服務器類和一個客戶端類,客戶端創建一個套接字併發送任何你輸入到服務器中的信息,寫入到所有現有套接字向量的輸出流中客戶端。它運作良好,當你關閉聊天客戶端,之後發送一條消息給下面的異常情況除外:聊天服務器寫入關閉的套接字

java.net.SocketException: Software caused connection abort: socket write error 

我覺得發生了什麼事是由客戶端關閉套接字或者未關閉套接字服務器的向量的套接字,或者即使它關閉,它仍然在向量中,然後嘗試寫入一個封閉的套接字。這聽起來像什麼可能發生?我不明白socket.close()方法對於它連接的套接字究竟做了什麼。

回答

1

關閉客戶端的套接字,但在服務器端沒有關閉,這就是爲什麼你會得到這個異常。

在優雅的關閉狀態下,您應該從客戶端發送CLOSE消息,這會關閉服務器端的套接字。

如果客戶端上的套接字已關閉,則必須在服務器端處理例外,例如,通過從你的套接字中刪除它。

+0

他不需要CLOSE消息,並且客戶端無法做到的任何事情都會奇蹟般地關閉服務器上的套接字。只有服務器可以做到這一點。他只需要在兩端寫一個close()。 – EJP

-1

我不認爲這就像連接的雙方都是用手握在一起,如果你將它們分開,他們總會感覺到它。在發送之前檢查套接字是否已關閉,並捕獲異常以解決此問題。

+0

檢查套接字是否關閉不會告訴他連接是否由另一端關閉。 – EJP

0

如果客戶端關閉套接字他,你會在服務器上讀取EOS(read()返回-1,readLine()回報nullreadXXX()拋出EOFException任何其他X),或寫時,可能不會在第一次寫入得到IOException: connection reset by peer。如果發生這些事情之一,您必須關閉服務器中的套接字,並以各種方式忘記該客戶端。

+0

@downvoter請解釋你的答案的理由。如果可能,引用。 – EJP

相關問題