因爲最近要作一個客戶端,可是要求有一個掉線檢測的功能,下面讓咱們看看使用自定義的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