服务器如何判断客户端非正常掉线-心跳连接

时间:2021-06-07 14:51:12
 

服务器如何判断客户端非正常掉线-心跳连接


心跳:如果不主动关闭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.     }