此文讲述的内容是一个实际项目开发中的一部分内容,笔者将亲身经历写成文章。

【背景】

现 需要实现这样的功能:有多个客户端连着同一个服务器。服务器和客户端之间需要“互相”知道彼此的连接状态。比如在某一时刻,服务器需要知道当前有多少个客 户端正在和其通信;某一个时刻,某个客户端需要知道自己是否和服务器保持连接。如果在某一时刻,一个客户端关闭了,服务端应能及时感觉到;同样,如果服务 端被关闭,所有的客户端应能及时感觉到,并作出一些反应。

【思考】

看 到这个需求,直观上的反应就是在服务端维护一个在线列表。当服务端的监听器监听到一个连接,就把该连接对应的客户端信息加入这个在线列表。这样就完成了对 上线状况的记录。但下一个问题是如何让服务器知道客户端的离线状况呢?我们可能会想到,让客户端在关闭前发送一个消息到服务端,服务端收到消息后就把客户 端置为离线状态。但是,在更多情况下,客户端并不是这么“友好”地关闭的。应用程序崩溃、网络连接被重置、机器死机等情况下,客户端来不及发送“离线通 知”给服务端就挂掉了。这时,需要有一套机制,能让服务端和客户端彼此对对方的在线状态保持清醒。

【概念】

何谓“心跳”? 心跳就是指“活着”的客户端或服务端每隔一定的时间就互相发送接收一个消息,告诉对方自己“活着”。当客户端或服务端超过一定的时间间隔尚未收到对方的“心跳”消息,就认为对方“死了”。这就是“心跳机制”的核心思想。

【设计实现】

在客户端,除了 UI 外,需要三个线程在后台工作。

1,自动连接的线程。该线程可以实现每隔指定时间就检查一次连接状态,如果发现当前是“离线”状态,就自动发起向服务端的一次连接。

 private void ThreadConnect(){do{if (!_bConnected){_bConnected = _sender.Connect(_ip, _port);if (_bConnected){Thread threadSendAndReceivePulseMessage = new Thread(new ThreadStart(ThreadSendAndReceivePulseMessage));threadSendAndReceivePulseMessage.IsBackground = true;threadSendAndReceivePulseMessage.Start();Thread threadCheckPulseCount = new Thread(new ThreadStart(ThreadCheckPulseCount));threadCheckPulseCount.IsBackground = true;threadCheckPulseCount.Start();_pulseCount = 0;OnConnected(new EventArgs());}}Thread.Sleep(_connectInterval);}while (_bWorking && _bAutoReconnect);
}

2,收发“心跳”消息的线程。该线程和服务端进行收发心跳消息。注意每收到服务器发来的消息,应将心跳计数器置零。心跳计数器的含义是已经隔了多少个心跳周期没收到心跳消息了。

private void ThreadSendAndReceivePulseMessage()
{while (_bWorking && _bConnected){string recv =  _sender.Receive(64);if (recv == "PULSE"){_pulseCount = 0;_sender.Send("ALIVE");}else{ _bConnected = false;_sender.Close();}Thread.Sleep(10);}
}

3,检查心跳计数器的值的线程。该线程每隔指定的时间间隔就检查一次心跳计数器,当发现已经超过指定心跳周期(比如3次)未接收到心跳消息,就认为是离线了,则进行相应的处理。

private void ThreadCheckPulseCount()
{while (_bWorking && _bConnected){Thread.Sleep(_pulseInterval);_pulseCount++;if (_pulseCount > _maxPulseCount){_bConnected = false;_sender.Close();}if (!_bConnected){OnDisconnected(new EventArgs());}}
}

在服务端,设计思想类似,需要维护一个“在线列表”,并及时和客户端通信,此处省略代码。

转载于:https://www.cnblogs.com/Areas/p/5757151.html

[心跳] 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连...相关推荐

  1. cs架构下抓包的几种方法

    burp+Proxifier进行抓包 安装证书 安装完证书配置主机代理,可以直接从chrome进入 要注意选择安装在受信任的根证书颁发机构下 Proxifier设置burp的代理 因为用的burp所以 ...

  2. “嘭、嘭、嘭”---C/S架构下的心跳机制

    本人想使用AU3开发多客户端.一服务端.需要使用到心跳机制,即 在线状态实时更新以及掉线自动重连. 搜索网络发现没有人用AU3写心跳机制. 下面是一篇转帖(原文地址:http://www.cnblog ...

  3. CS架构和BS架构的发展趋势即在图像处理软件中的应用

    趋势:总体来讲有融合的趋势,你中有我,我中有你.前后端分离的技术大行其道,前端更像是把原来桌面上的工作搬到浏览器中实现. websocket能像桌面一样工作: javascript的语法增加了clas ...

  4. BS架构和CS架构的定义以及区别

    1.什么是BS架构 B/S架构是浏览器和服务器架构模式.是对C/S架构的一种变化或者改进的架构. B/S架构不用安装客户端,只需要在客户机上安装一个浏览器,服务端安装一种数据库,就可以通过webser ...

  5. 开发手机蓝牙硬件APP如何实现蓝牙自动重连机制

    在日常使用蓝牙的过程中,想必大家都发现了这样一个现象:连接蓝牙设备的手机在关闭再重新打开蓝牙后,会自动连接上先前连接着的那个设备,同样的场景对于安卓手机系统效果也是一致的.那这是怎么实现的呢,本篇文章 ...

  6. Socket连接心跳包的机制总结

    文章目录 Socket连接心跳包的机制总结 心跳包的由来 心跳包的作用 心跳包由服务端还是客户端发送? Socket连接心跳包的机制总结 心跳包的由来 心跳包之所以叫心跳包是因为:它像心跳一样每隔固定 ...

  7. Eureka心跳续约机制

    本文来说下Eureka心跳续约机制 文章目录 概述 Eureka-Client发送心跳 DiscoverClient HeartbeatThread lastDirtyTimestamp Eureka ...

  8. 微服务架构下静态数据通用缓存机制

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 |  my.oschina.net/u/3971241/bl ...

  9. 微服务架构下的静态数据通用缓存机制!

    什么是静态数据 为什么需要缓存 通用缓存机制 总结 后记 在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验 ...

最新文章

  1. linux命令less
  2. 给定数组 求和等于固定值 算法_[见题拆题] 大厂面试算法真题解析 - 第一期开张...
  3. Python爬虫xpath详解
  4. CG CTF MISC MD5
  5. 虚拟局域网Vlan与单臂路由、三层交换、链路聚合技术
  6. 开发者应警惕的七种糟糕职业规划错误
  7. 关于Exchange管理控制台报“您的权限不足,无法此查看数据”的解决办法
  8. 什么叫云平台_为什么说云原生会成为未来企业技术变迁的趋势
  9. 方案改进:直接通过User Control生成HTML
  10. 数据3分钟丨墨天轮2021年度数据库奖项及中国数据库魔力象限等多项成果发布...
  11. Swift学习笔记_数据类型_整数类型
  12. java怎样实现数据库 选择列属性的select查询??_除了不要 SELECT * ,使用数据库还应知道的11个技巧!...
  13. Illustrator 教程,如何在 Ai 中创建一个新文档?
  14. Scrum项目6.0 和8910章读后感
  15. redis,memcache二者的区别
  16. 计算机配置内存容量怎么调,如何设置电脑虚拟内存,电脑虚拟内存设置多少最合理?...
  17. 论文阅读:CCX-RAYNET: A CLASS CONDITIONED CONVOLUTIONAL NEURAL NETWORK FOR BIPLANAR X-RAYS TO CT VOLUME
  18. python字典中删除键值对的del语句与pop方法
  19. HTML绘制七巧板,如何使用HTML5 CSS3制作简单七巧板
  20. Word文档中实现:点击图片双击放大

热门文章

  1. 对 Python 开发者而言,IPython 仍然是 Jupyter Notebook 的核心
  2. 我使用Python和Django在自己的网站上建立了一个会员专区。 这是我学到的东西。
  3. 导入语句 python_Python导入语句说明
  4. react.js做小程序_如何使用React.js构建现代的聊天应用程序
  5. hung-yi lee_p13_反向传播
  6. 软件测试培训需要学习什么技术
  7. 分享五款java学习辅助工具,总有你用的上的~
  8. IEEE 解除对华为的限制!
  9. Visual Paradigm 教程[UML]:如何使用刻板印象和标记值?(下)
  10. 读书笔记:《图解HTTP》第三章 HTTP报文