zoukankan      html  css  js  c++  java
  • 心跳包技术

    百度上对于心跳机制的解释是:

        心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制

    从字面意思上来看,我们可以知道,它其实在检测socket是否断开的环境下有很大作用,我们就不用担心socket会因为不正常掉线而使得自己的数据丢失了,接下来我们就好好来看看它到底该如何去用

        心跳检测步骤:
          1、客户端每隔一个时间间隔发生一个探测包给服务器
          2、客户端发包时启动一个超时定时器
          3、服务器端接收到检测包,应该回应一个包
          4、如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
          5、如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了

    原理上我们已经搞清楚了,接下来就是具体的实现了

    上代码===》》》

    客户端:

     1 public class Client {
     2     public static void main(String[] args) {
     3         boolean isSocket = true;
     4         Socket socket = null;
     5         while(isSocket){
     6             try {
     7                 socket = new Socket("192.168.0.174", 30000);
     8                 isSocket = false;
     9                 socket.setKeepAlive(true);   //定期检查两边连接状态
    10                 socket.setSoTimeout(10);     //设置超时时间
    11                 while (true) {
    12                     socket.sendUrgentData(0xFF); // 发送心跳包
    13                     System.out.println("处于链接状态!");
    14                     Thread.sleep(2 * 1000);//线程睡眠3秒
    15                 }
    16             } catch (Exception e) {
    17                 System.out.println(socket +"");
    18                 isSocket = true;
    19                 //当连接断开就抛出异常
    20                 e.printStackTrace();
    21             } 
    22         }
    23     }
    24 }

    服务器:

     1 public class Server {
     2     public static void main(String[] args) {
     3         try {
     4             ServerSocket ss = new ServerSocket(30000);
     5             while(true){
     6                 final Socket s = ss.accept();
     7                 // 将请求指定一个线程去执行
     8                 new Thread(new Runnable() {
     9                     public void run() {
    10                         try {
    11                             Thread.sleep(1 * 1000);
    12                         } catch (InterruptedException e) {
    13                             e.printStackTrace();
    14                         } 
    15                     }
    16                 }).start();
    17             }
    18         } catch (Exception e) {
    19             e.printStackTrace();
    20         }
    21     }
    22 }

    执行结果:

    我在客户端给它设置了一个标志位,当发现客户端掉线时会自动再连接上,实现了循环连接循环发送。当然,你也可以在服务器端手动去close掉连接,然后让客户端去连,这就需要你自己去根据下图操作了

    但是我们发现了一个问题,当它发送了17次之后,客户端会自动断线,在网上搜素之后发现大家也有这个问题,原因到底是什么呢?

    待续...

  • 相关阅读:
    Invalid character found in method name. HTTP method names must be tokens
    使用idea合并分支
    jenkins企业级实战
    Custom runner class Runner should have a public constructor with signature R
    java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.([Ljava
    eclipse启动A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be available in order
    windows配置jdk环境变量
    无法上传空目录到git仓库
    VirtualBox配置Centos网络和域名解析
    052(二十)
  • 原文地址:https://www.cnblogs.com/ytlds/p/5661462.html
Copyright © 2011-2022 走看看