@(根據心跳包的理論機制來實作—UDP篇)
創建UDPConnected模塊
public class UdpConnected
{
private bool _isLive;
public IPEndPoint EndPoint { get; set; }
System.Timers.Timer timer = null;
//設定狀態過期時間
private void WaitResponse()
{
timer = new System.Timers.Timer(3000);
timer.Elapsed += delegate (object sender, System.Timers.ElapsedEventArgs a)
{
_isLive = false;
};
timer.Enabled = true;
timer.Start();
}
public bool IsLive
{
get
{
return _isLive;
}
set
{
if (timer != default(System.Timers.Timer))
{
timer.Close();
timer.Dispose();
}
WaitResponse();
_isLive = value;
}
}
}
創建接收upd連接成功的串列容器 List<UdpConnected>
心跳包(每隔一段時間發送一個空資料包)
設定一個優先級低的后臺執行緒來運行
public virtual void Heartbeat(object obj)
{
UdpClient udp = obj as UdpClient;
while (true)
{
_connecteds.ForEach(i =>
{
udp.Send(new byte[0], 0, i.EndPoint);
});
UdpConnectChanged?.Invoke(_connecteds);
Thread.Sleep(1000);
}
}
實際應用
當UDP服務端接收空資料包(byte[0])時即注冊連接,當然也可以發送特定的資料模型來建立連接,
//udp server
private IPEndPoint _recvIp=new IPEndPoint(IPAddress.Any,0);//監聽任意埠 用于保存連接資料
public virtual void Recv(object obj)
{
UdpClient udp = obj as UdpClient;
while (true)
{
byte[] bRecv = default(byte[]);
try
{
bRecv = udp.Receive(ref _recvIp);
}
catch (Exception ex)
{
continue;
}
var query = _connecteds.Where(i => i.EndPoint.ToString() == _recvIp.ToString()).ToList();
if (bRecv.Length == 0)
{
if (query.Count == 0)
{
_connecteds.Add(new UdpConnected() { EndPoint = _recvIp, IsLive = true });
}
else if (query.Count == 1)
{
query.First().IsLive = true;
}
else
{
throw new Exception("錯誤");
}
}
else if (bRecv.Length != 0 && query.Count == 1)
{
//接收訊息
OnReceived?.Invoke(bRecv,_recvIp);
}
}
}
Udp 客戶端在啟動時需要向服務器發送空資料包(byte[0]) 用于驗證連接,
并啟用后臺執行緒來運行
//client
public virtual void Recv(object obj)
{
UdpClient client= obj as UdpClient;
while (true)
{
byte[] bRecv = default(byte[]);
try
{
bRecv = client.Receive(ref serviceIp);
}
catch (Exception)
{
continue;
}
if (bRecv.Length == 0)
{
byte[] a = new byte[0];
client.Client.SendTo(a, a.Length, SocketFlags.None, serviceIp);
}
else
{
var res = Encoding.Default.GetString(bRecv);
Console.WriteLine(res);
}
}
}
本篇是初作,新人不易,多多支持! 【若轉載請注明出處】
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226978.html
標籤:其他
下一篇:FIFO的基本知識與設計實作
