Socket之心跳包實現思路

因爲最近要作一個客戶端,可是要求有一個掉線檢測的功能,下面讓咱們看看使用自定義的HeartBeat方式來檢測客戶端的鏈接狀況。blog

心跳包的實現思路:get

客戶端鏈接上服務端後,在服務端會維護一個在線客戶端列表。客戶端每隔一段時間,向服務端發送一個心跳包,服務端受收到包之後,會更新客戶端最近一次在線時間。一旦服務端超過規定時間沒有接收到客戶端發來的包,則視爲掉線。it

 

代碼:ast

客戶端每隔一段時間,發送一個心跳包:class

           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);
            };

  

服務端每隔一段時間檢測:        cli

             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);
                 }
             };

  

服務端收到心跳包的處理邏輯:sed

            Console.WriteLine("收到客戶端" + msg.RemoteEndPoint + "的心跳回應包.");

            client.LastOnLine = DateTime.Now;  //收到心跳包,更新時間
            client.Name = msg.RemoteEndPoint.ToString();
            client.RemoteEndPoint = msg.RemoteEndPoint;

            if (!clients.Contains(client))
             {
                 clients.Add(client);
             }

  

效果:foreach

image

相關文章
相關標籤/搜索