心跳包机制及Socket通信服务的心跳包

C#使用TCP/IP长连接获取数据、心跳检测 【代码】C#使用TCP/IP长连接获取数据、心跳检测。 阅读详情

本文转自http://www.cppblog.com/tx7do/archive/2009/11/09/100513.html  http://xue08161981.blog.163.com/blog/static/324996772009101010852137/

 心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。
    在TCP的机制里面,本身是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。
    心跳包一般来说都是在逻辑层发送空的echo包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。
    其实,要判定掉线,只需要send或者recv一下,如果结果为零,则为掉线。但是,在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。
    在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。
    总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

 

在一些系统中,经常用到客户端和服务器之间的通信,服务器要时刻知道客户端的网络连接状态,这大概就是所谓的“心跳包”。

下面是客户端心跳包核心代码:

# region ++++++++++++++++++++ 客户端的感觉系统

        //启动记时器

        public void BeginTheTimer()

        {

            //th_UserLogin();

            //这里只是要一个object类型数据,用它做为下面Timer的参数之一,没有其它意思

            object myobject = (object)7;

            //暂时设定为1秒钟启动一次!

            System.Threading.Timer t = new System.Threading.Timer

            (new System.Threading.TimerCallback(testTheNet), myobject, 1000, 1000);

        }

        //启动监视"已登录用户通信情况"的线程

        public void testTheNet(object myobject)  

        {

            //UserPassport up=new UserPassport();

            Thread sendMyPulseThPro = new Thread(new ThreadStart(delegateSendMyPulse));

            sendMyPulseThPro.Start();

        }  

        

        /// <summary>

        /// 每隔1秒就是要来做这些事情的

        /// </summary>

        public void delegateSendMyPulse()

        {

            loginServer lser = new loginServer();

            Login l = new Login();

            l.Id = lser.MyLogin.Id;

            l.ClientTypeVersion = version;

            l.RequestType = 3;          

            //3是确认联接正常的一个信号(让服务知道它与服务器的联接是正常的)

            loginServer lserver = new loginServer();  

            //启动一个新线程去发送数据          

            Thread thSendDat2 = new Thread

            (new ParameterizedThreadStart(lserver.delgSendDataMethod));

            thSendDat2.Start(l);

            thSendDat2.IsBackground = true;

            //标记我已经发送出去一次数据了

            longinserver.MyLostTime += 1;

            //如果外发了3次请求暗号后仍不见服务器的回应,则认为客户端已经与服务器断开联系了

            if(longinserver.MyLostTime>=3)

            {

                //停止Timer

                //告诉用户:“你已经与服务器失去联系了…………”

                longinserver.Controls["txtShowMsg"].Text = "You have lost the connect!";

            }

        }

# endregion +++++++++++++++++++++ 客户端的感觉系统

下面是服务器端核心代码如下:

# region +++++++++++++++++++++++ 服务器的感觉系统

        //启动记时器

        public void LoadTheTimer()

        { 

            object o=(object)loginedCount++;

            UserPassport up = new UserPassport();

            //暂时设定为1秒钟启动一次!

            System.Threading.Timer t = new System.Threading.Timer

            (new System.Threading.TimerCallback(watchTheLoginUser), o, 1000, 1000);            

                   }

        //启动监视"已登录用户通信情况"的线程

        public void watchTheLoginUser(object o)

        {

            //UserPassport up=new UserPassport();

            Thread checktheloginuser = new Thread(new ThreadStart(iAmAWatcher));

            checktheloginuser.Start();

        }

        //真正做事的工人:这个工人的使命是每隔1秒钟后就查看一下登记薄

        //registry里面有谁没有定时来向服务器报到了,如果出现谁三次检查都没有签到则除之名

        public void iAmAWatcher()

        {

            this.txtLogin.Text += "@+";

            int index = 0;

            for (index = 0; index < loginedCount; index++)

            {

                if (myRegistry[index].alive==false&&registry[index].studentID!="")

                {

                    lock(this)

                    {

                        //坏(未到)记录增加一次

                        myRegistry[index].no_check_in_count += 1;           

                   

                        if (myRegistry[index].no_check_in_count >= 3)

                        {

                            //this.lblShowMsg.Text = "the student" 

                            //this.lblShowMsg.Text += registry[index].studentID.ToString() 

                            //this.lblShowMsg.Text += "is diaoxianle!";

                            this.txtLogin.Text += "88";

                            //标记该人已经与服务器失去连接了,因为他有连续3次的未到记录存在

                            registry[index].studentID = "";

                            registry[index].StudentName = "";

                            registry[index].StudentIP = "";

                            registry[index].status = 2;      //掉线

                            

                        }

                    }

                }

            }

        }  //定时检查在线人目前状态

# endregion +++++++++++++++++++ 服务器的感觉系统

C# 心跳包(服务端,客户端) 实操项目中切割下来的一部分,功能完整可实现,希望能帮到大家。 立即下载

相关推荐

eXosip开发者手册

eXosip开发者手册,详细描述了eXosip2协议栈的使用方法,包括关键接口的说明

C# 优雅的为Tcp客户端设计心跳数据包

心跳机制是定时发送一个自定义的 结构体 (心跳包),让对方知道自己还活着,以确保连接的有效性的机制。 网络中的接收和发送数据都是使用操作系统中的 SOCKET 进行实现。 但是如果此 套接字 已经断开,那发送数据和接收数据的时候就一定会有问题。 可是如何判断这个套接字是否还可以使用呢? 这个就需要在系统中创建心跳机制。 其实TCP中已经为我们实现了一个叫做心跳的机制。但是该机制受限于操作系统,而且很容易误报。所以很少被大家使用。大家使用最多的,就是自己设计数据包,然后预留心跳格式,当对方收到心跳包时,直接返

若汝棋茗 的博客 7929

VC下实现的心跳包源码

VC下 控制台程序 本人正在学习通信编程 实现个简单的心跳包 目的在于理解心跳包的实现原理 谨适合初学者

C#使用Socket实现心跳

Server端代码: class Program { static SocketListener listener; public static void Main(string[] args) { //实例化Timer类,设置间隔时间为5000毫秒; System.Timers.Timer t = new System.Timers.T

风之&诉 1万+

基于DE2-115红外解码实验

基于DE2-115红外解码实验   一、   功能描述 在同一个遥控电路中通常要使用实现不同的遥控功能或区分不同的机器类型, 这样就要求信号按一定的编码传送,编码则会由编码芯片或电路完成。对应于编码芯片通常会有相配对的解码芯片或包含解码模块的应用芯片。在实际的产品设计或业余电子制作中,编码芯片并一定能完成我们要求的功能,这时我们就需要了解所使用的编码芯片到底是如何编码的。只有知道编码方式,我...

乘风的博客 2513

STM32F407通过SMBus协议精准读取BQ40Z50电池电量

本文详细介绍了STM32F407通过SMBus协议精准读取BQ40Z50电池电量的实现方法。从硬件连接到软件驱动开发,再到通信异常排查,提供了完整的解决方案。重点解析了SMBus协议的特殊时序要求、GPIO模拟驱动的关键代码,以及实际调试中的常见问题与对策,帮助开发者高效完成电池管理系统开发。

weixin_29189003的博客 250

C#之实现Scoket心跳机制

TCP网络长连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。 建立起一个TCP连接需要经过“三次握手”: 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客

TxNet 3万+

解决在封装自定义IP时加入ila,或者其他ip核时出错的情况

在查阅很多资料后,明白了这个应该是软件bug,但是最终还是解决了问题 我们只需要删除

weixin_42553916的博客 3604

C#基于Socket的UDP和TCP处理通信报文(包含心跳包+业务处理+数据库)

设备通过TCP/IP接入OMC,此时OMC作为TCP/IP服务端,主设备作为客户端且主设备IP地址和端口号可设。主设备通过开站上报数据包或者登录包来主动接入OMC。开站上报的接入流程如下(登录包与之相似) 包的协议格式如下: 起始标志 (7E) AP层协议类型 (01或03) 承载协议类型 (01) 数据单元(PDU) 校验单元 ...

ba_wang_mao的专栏 2978

高速PCB设计中的一些常用规则

目前,高速PCB产品设计中,高速接口的应用日益普及,对于复杂的设计而言,高速走线就如同“蜘蛛网”一样密布在PCB各处,因此,在进行PCB检查及评审时,必要的高速PCB设计经验法则及规则是工程师开展工作必不可少的知识储备。

一只豌豆象的博客 3413

面向边缘计算的YOLOv12模型剪枝-蒸馏联合优化实战教程**

这套剪枝-蒸馏联合方案的优势在于其系统性和可靠性。它不是单一的技巧,而是一套完整的工程流程,确保了从研发到部署的无缝衔接。

FJN110的博客 158

Socket心跳包机制

Socket心跳包机制像心跳一样,每隔固定时间向服务器发送一个包,以此来告诉服务器,这个客户端还“活着”。这是为了保持长连接,一般发送的都是很小的包(节约流量)活着只有包头的空包。心跳检测步骤 客户端每隔一段时间间隔就发送一个探测包给服务器 客户端发包时启动一个超时定时器 服务端接收到检测包后回应一个包 如果客户端收到服务器的应答包,则说明服务器正常,删除超时定时器 如果与4不同,则服务器异常 心跳

从这里继续 1239

STM32F103RCT6的FLASH读写操作

STM32F103RCT6是一款常用的32位微控制器,它具有内置的FLASH存储器,可以用于存储程序代码和数据。在本文中,我们将详细介绍如何进行STM32F103RCT6的FLASH读写操作,并提供相应的源代码。写入数据时,我们通过将数据直接写入FLASH地址来完成。通过使用适当的API和规则,我们可以有效地读取和写入数据。写入FLASH时,我们需要按特定的规则进行编程。首先,我们需要包含适当的头文件和定义相关的宏和变量,以便在代码中使用FLASH API。类型的指针,我们可以直接读取FLASH中的数据。

UplKubernetes的博客 1032

Android网络编程基础之Socket通信实战

socket通信实战

yzpbright的博客 1947

机器学习(十九):梯度提升回归(GBR)

机器学习中的梯度提升回归算法原理与案例实战。

全栈川川 5156

Coze实战:解锁多Bot协同与条件分支工作流的奥秘

本文详细介绍了在字节跳动Coze平台实现多Bot协同与条件分支工作流的方法。首先阐述了Coze平台的功能优势,包括丰富的插件、知识库和工作流功能。随后分步骤讲解了多Bot协同的实现:从准备工作、创建Bot到协同配置,并提供了电商客服的实例演示。在条件分支工作流部分,详细说明了条件节点的作用类型、条件设定方法以及具体配置操作,强调测试优化的重要性。最后通过电商平台综合案例,展示了多Bot协同与条件分支的实际应用效果,并针对常见问题提供解决方案。文章为开发者在Coze平台上构建智能应用提供了实用指导,有助于提升

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 449

RPC socket长连接通信 Java制作简单的双人聊天软件 Netty

一。客户端和服务端 1.创建服务端(客户端) 2.连接客户端(服务端) 3.开启发送消息和接收消息两个线程 服务端 (创建端,连接端,开启线程) /*sockte服务器*/ public class Server { public static void main(String[] args) throws Exception { //1.创建socket服务端 ...

飘然生的博客 409

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

转 iOS学习之Socket使用简明教程- AsyncSocket

为什么80%的码农都做不了架构师?>>> ...

weixin_34018169的博客 97

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

嵌入式开发之网络连接管理

嵌入式开发之网络连接管理 本文在这主要记录关于开发板无线网络连接状态的监管,由于项目需求,需要对产品的功能进行优化,要求有一个掉线检测的功能,下面让我们看看使用自定义的HeartBeat方式来检测客户端的连接情况。 ###1、心跳机制 心跳包由来 :像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的...

whj1317141989的博客 968

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 测试网络硬盘
下一篇: java/lang/ClassFormatError: Bad version informationd在Eclipse和Jbuilder的修改方法
QGJava
博客等级 码龄16年 14粉丝 8原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值