day3 – 心跳包和TCP

本文介绍了TCP心跳包的实现机制,即客户端定时发送心跳包到服务端,服务端根据心跳维持在线状态。同时,讲解了Windows下套接字标准Winsock的基本概念,包括如何创建、绑定、监听、连接套接字以及发送和接收数据。内容包括WSAStartup、WSACleanup等函数的使用,以及TCP连接过程的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

心跳包的实现思路:

客户端连接上服务端后,在服务端会维护一个在线客户端列表。客户端每隔一段时间,向服务端发送一个心跳包,服务端受收到包以后,会更新客户端最近一次在线时间。一旦服务端超过规定时间没有接收到客户端发来的包,则视为掉线。

代码:

客户端每隔一段时间,发送一个心跳包:

var timer = new System.Timers.Timer();
timer.Interval = 60000;  //1m触发一次
timer.Start();
 
timer.Elapsed += (sender, args) =>
 {
     Console.WriteLine("开始发送心跳包");
     MMessage message = new MMessage();
     message.MessageType = MessagePicks.Heartbeat;
     // message.From = loginName;
 
    WriteToStream(message);
 };

服务端每隔一段时间检测:

var timer = new Timer();
timer.Interval = 60000;  //1m触发一次
timer.Start();
timer.Elapsed += (sender, args) =>
{
    List<MClient> offClients = new List<MClient>();
 
   foreach (var client in clients)
    {
        if ((DateTime.Now - client.LastOnLine).TotalMinutes > 1)
        {
            Console.WriteLine("用户" + client.Name + "掉线!");
            offClients.Add(client);
        }
    }
 
   foreach (var offClient in offClients)
    {
        clients.Remove(offClient);
    }
};

服务端收到心跳包的处理逻辑:

Console.WriteLine("收到客户端" + msg.RemoteEndPoint + "的心跳回应包.");
 
client.LastOnLine = DateTime.Now;  //收到心跳包,更新时间
client.Name = msg.RemoteEndPoint.ToString();
client.RemoteEndPoint = msg.RemoteEndPoint;
 
if (!clients.Contains(cl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值