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

異常以下:

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

引發後果

服務端不知道客戶端socket已經關閉,若是繼續發送數據,可能致使發送如上關閉異常。若是有多個客戶端長鏈接給服務端創建,異常處理不恰當的話,還可能引發下次發送異常關閉狀況。java

解決方案

socket客戶端斷開以後會回調服務端socket,這時服務端發現輸入流的長度爲 -1 這時首先須要關閉客戶端socket,而後把該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;
            }
相關文章
相關標籤/搜索