socket客戶端異常關閉,服務端解決方案

異常如下:

java.net.SocketException: Socket is closed 	
at java.net.Socket.getOutputStream(Socket.java:916) ~[na

引起後果

服務端不知道客戶端socket已經關閉,如果繼續發送數據,可能導致發送如上關閉異常。如果有多個客戶端長連接給服務端建立,異常處理不恰當的話,還可能引起下次發送異常關閉情況。

解決方案

socket客戶端斷開之後會回調服務端socket,這時服務端發現輸入流的長度爲 -1 這時首先需要關閉客戶端socket,然後把該socket從發送列表中刪除。

Java代碼實例

  1. 檢測是否斷開
int len = in.read(head, 0, Const.PACK_HEAD_LEN);
                // socket 已經斷開,跳出循環
                if (len == -1) {
                    break;
                }
  1. 關閉客戶端socket並且移除發送客戶端socket
 try {
                socket.close();
                sockets.remove(socket);
            } catch (IOException e) {
                this.logger.error(e);
            } finally {
                socket = null;
            }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章