伺服器如何判斷客戶端非正常掉線-心跳連線
阿新 • • 發佈:2019-02-05
心跳:如果不主動關閉socket的話,系統不會自動關閉的,除非當前程序掛掉了,作業系統把佔用的socket回收了才會關閉。為什麼需要心跳連線主要是判斷當前連線是否是有效的、可被使用的。在實際應用中假設一段時間沒有資料傳輸時候理論上說應該連線是沒有問題的,但是網路複雜,中途出現問題也是常見的,網線被掐斷了、對方程序掛掉了、頻繁丟包等,這時候TCP連線是不可使用的,但是對於應用層並不知道,如果需知道網路情況則要很複雜的超時進行了解,TCP從底層就實現了這樣的功能。心跳機制是TCP在一段時間間隔後傳送確定連線端是否還存在,如果存在的話就會回傳一個包確定網路有效,如果心跳包有問題,則通知上層應用當前網路有問題了。
實現:
- publicvoid heartCheck(final ClientSocket socket){
- //心跳連線(檢查斷鏈) 伺服器斷線重連
- new Thread(new Runnable() {
- publicvoid run() {
- while (true) {
- if(socket.isConnectStatus()==false)break;
- try {
-
socket.sendHeartCheck();//socket.sendUrgentData(0xFF);
- //System.out.println("目前是正常的!");
- Thread.sleep(10 * 1000);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- System.out.println("心跳檢測到客戶端"+socket.getServer_Id()+"掉線");
-
socket.destroy();
- break;
- } // 傳送心跳包
- catch (Exception e) {
- // TODO Auto-generated catch block
- //e.printStackTrace();
- }
- }
- }
- }).start();
- }