服務器如何判斷客戶端非正常掉線-心跳連接

 

服務器如何判斷客戶端非正常掉線-心跳連接


心跳:如果不主動關閉socket的話,系統不會自動關閉的,除非當前進程掛掉了,操作系統把佔用的socket回收了纔會關閉。爲什麼需要心跳連接主要是判斷當前連接是否是有效的、可被使用的。在實際應用中假設一段時間沒有數據傳輸時候理論上說應該連接是沒有問題的,但是網絡複雜,中途出現問題也是常見的,網線被掐斷了、對方進程掛掉了、頻繁丟包等,這時候TCP連接是不可使用的,但是對於應用層並不知道,如果需知道網絡情況則要很複雜的超時進行了解,TCP從底層就實現了這樣的功能。心跳機制是TCP在一段時間間隔後發送確定連接端是否還存在,如果存在的話就會回傳一個包確定網絡有效,如果心跳包有問題,則通知上層應用當前網絡有問題了。


實現:

[java] view plain copy
  1. public void heartCheck(final ClientSocket socket){  
  2.         //心跳連接(檢查斷鏈) 服務器斷線重連  
  3.         new Thread(new Runnable() {  
  4.               
  5.             public void run() {  
  6.                 while (true) {    
  7.                     if(socket.isConnectStatus()==false)break;  
  8.                     try {  
  9.                         socket.sendHeartCheck();//socket.sendUrgentData(0xFF);  
  10.                         //System.out.println("目前是正常的!");    
  11.                         Thread.sleep(10 * 1000);    
  12.                     } catch (IOException e) {  
  13.                         // TODO Auto-generated catch block  
  14.                         System.out.println("心跳檢測到客戶端"+socket.getServer_Id()+"掉線");  
  15.                         socket.destroy();  
  16.                         break;  
  17.                     } // 發送心跳包    
  18.                     catch (Exception e) {  
  19.                         // TODO Auto-generated catch block  
  20.                         //e.printStackTrace();  
  21.                     }  
  22.                 }    
  23.                   
  24.             }  
  25.         }).start();  
  26.     }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章