我是靠谱客的博主 愤怒枕头,这篇文章主要介绍心跳包技术,现在分享给大家,希望可以做个参考。

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

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

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

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

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

上代码===》》》

客户端:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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次之后,客户端会自动断线,在网上搜素之后发现大家也有这个问题,原因到底是什么呢?

待续...

转载于:https://www.cnblogs.com/ytlds/p/5661462.html

最后

以上就是愤怒枕头最近收集整理的关于心跳包技术的全部内容,更多相关心跳包技术内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(106)

评论列表共有 0 条评论

立即
投稿
返回
顶部