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