Socket之心跳包實現思路


由於最近要做一個客戶端,但是要求有一個掉線檢測的功能,下面讓我們看看使用自定義的HeartBeat方式來檢測客戶端的連接情況。

心跳包的實現思路:

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

 

代碼:

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

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

  

效果:

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM