異常如下:
java.net.SocketException: Socket is closed
at java.net.Socket.getOutputStream(Socket.java:916) ~[na
引起後果
服務端不知道客戶端socket已經關閉,如果繼續發送數據,可能導致發送如上關閉異常。如果有多個客戶端長連接給服務端建立,異常處理不恰當的話,還可能引起下次發送異常關閉情況。
解決方案
socket客戶端斷開之後會回調服務端socket,這時服務端發現輸入流的長度爲 -1 這時首先需要關閉客戶端socket,然後把該socket從發送列表中刪除。
Java代碼實例
- 檢測是否斷開
int len = in.read(head, 0, Const.PACK_HEAD_LEN);
// socket 已經斷開,跳出循環
if (len == -1) {
break;
}
- 關閉客戶端socket並且移除發送客戶端socket
try {
socket.close();
sockets.remove(socket);
} catch (IOException e) {
this.logger.error(e);
} finally {
socket = null;
}