Socket之心跳包实现思路

原  https://www.cnblogs.com/snaildev/p/7724867.html 

心跳包的实现思路:

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

代码:

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



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(client))
 {
     clients.Add(client);
 }

https://www.cnblogs.com/scy251147/p/3333957.html 

猜你喜欢

转载自blog.csdn.net/qq_40086556/article/details/81639142