LiteNetLib封装

发布时间:2026/7/27 8:57:53
LiteNetLib封装 LiteNetLib使用响应函数返回网络数据但我不想在服务器程序中出现LiteNetLib相关的大量代码就只有把LiteNetLib封装成了一个单独的类然后暴露几种LiteNetLib服务器运行的消息队列。而我自己的逻辑服务器解耦LiteNetLib服务器只需要拉取这几种消息即可。封装LiteNetLib的架构好处如下我的服务器LiteNetLib服务器 LiteNetLib服务器-----我的服务器。Form1using LiteNetLib; using LiteNetLib.Utils; using MessagePack; using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; namespace LiteNetServer { public partial class Form1 : Form { public LiteNetService NetService new LiteNetService(); public Form1() { InitializeComponent(); if (NetService.server.IsRunning) MT.ps(listBox1, Server starting... Port NetService.server.LocalPort); Task.Run(Thread1); } //发对象 private void button2_Click(object sender, EventArgs e) { ListOBJ01 playerList new(); for (int i 0; i 100000; i) playerList.Add(new OBJ01 { id 1, aaa 哈哈哈哈, x 100, y 100 }); MT.SendListToClient(NetService.clients, int.Parse(textBox1.Text), MsgType.OBJ01, playerList); MT.ps(listBox1, 向客户端ID: textBox1.Text 发送对象player); } private void button3_Click(object sender, EventArgs e) { ListOBJ02 items new(); for (int i 0; i 10000; i) items.Add(new OBJ02 { id 1001, bbb 物品1, z 10 }); MT.SendListToClient(NetService.clients, int.Parse(textBox1.Text), MsgType.OBJ02, items); MT.ps(listBox1, 向客户端ID: textBox1.Text 发送对象item); } void Thread1() { while (true) { Task.Delay(200).Wait(); // 连接请求 var reqs NetService?.FetchAndClearConnectionRequests(); if (reqs.Count 0) { foreach (var r in reqs) MT.ps(listBox1, $收到连接请求 {r.RemoteEndPoint} 时间:{r.Timestamp:HH:mm:ss}); } // 连接成功 var conns NetService?.FetchAndClearPeerConnectedMessages(); if (conns.Count 0) { foreach (var p in conns) MT.ps(listBox1, $客户端已连接,ID:{p.Id} 时间:{p.Timestamp:HH:mm:ss}); } // 连接断开 var disconns NetService?.FetchAndClearPeerDisconnectedMessages(); if (disconns.Count 0) { foreach (var d in disconns) MT.ps(listBox1, $客户端断开,ID:{d.Id} 原因:{d.Reason} 时间:{d.Timestamp:HH:mm:ss}); } // 收到消息 var recvs NetService?.FetchAndClearObj01Lists(); if (recvs.Count0) { ListOBJ01 usblist recvs.First(); MT.ps(listBox1, $收到客户端OBJ01{recvs.Count}, usblist数量{usblist.Count}); } var recvs2 NetService?.FetchAndClearObj02Lists(); if (recvs2.Count0) { ListOBJ02 usblist recvs2.First(); MT.ps(listBox1, $收到客户端OBJ02{recvs2.Count}, usblist数量{usblist.Count}); } } } } }LiteNetServiceusing LiteNetLib; using LiteNetLib.Utils; using MessagePack; using System; using System.Collections.Generic; using System.Collections.Concurrent; namespace LiteNetServer { public class LiteNetService : IDisposable { public static EventBasedNetListener listener new EventBasedNetListener(); public NetManager server new NetManager(listener); public Dictionaryint, NetPeer clients new(); // 事件消息队列并行安全 public ConcurrentQueueConnectionRequestMsg ConnectionRequests { get; } new(); public ConcurrentQueuePeerConnectedMsg PeerConnectedMessages { get; } new(); public ConcurrentQueuePeerDisconnectedMsg PeerDisconnectedMessages { get; } new(); // 新增接收到的 OBJ01 列表队列并行安全 public ConcurrentQueueListOBJ01 Obj01Messages { get; } new(); public ConcurrentQueueListOBJ02 Obj02Messages { get; } new(); // 公开事件保留但可不订阅 public event ActionConnectionRequest ConnectionRequestEvent; public event ActionNetPeer PeerConnectedEvent; public event ActionNetPeer, DisconnectInfo PeerDisconnectedEvent; public event ActionNetPeer, NetPacketReader, byte, DeliveryMethod NetworkReceiveEvent; // Fetch 方法从并发队列中取出并返回当前所有元素 public ListConnectionRequestMsg FetchAndClearConnectionRequests() { var list new ListConnectionRequestMsg(); while (ConnectionRequests.TryDequeue(out var item)) list.Add(item); return list; } public ListPeerConnectedMsg FetchAndClearPeerConnectedMessages() { var list new ListPeerConnectedMsg(); while (PeerConnectedMessages.TryDequeue(out var item)) list.Add(item); return list; } public ListPeerDisconnectedMsg FetchAndClearPeerDisconnectedMessages() { var list new ListPeerDisconnectedMsg(); while (PeerDisconnectedMessages.TryDequeue(out var item)) list.Add(item); return list; } // 取出所有 OBJ01 消息每个元素是一次从网络反序列化得到的 ListOBJ01 public ListListOBJ01 FetchAndClearObj01Lists() { var list new ListListOBJ01(); while (Obj01Messages.TryDequeue(out var item)) list.Add(item); return list; } public ListListOBJ02 FetchAndClearObj02Lists() { var list new ListListOBJ02(); while (Obj02Messages.TryDequeue(out var item)) list.Add(item); return list; } // 构造函数初始化监听器、服务器并订阅事件 public LiteNetService() { listener.ConnectionRequestEvent OnConnectionRequestHandler; listener.PeerConnectedEvent OnPeerConnectedHandler; listener.PeerDisconnectedEvent OnPeerDisconnectedHandler; listener.NetworkReceiveEvent OnNetworkReceiveHandler; server.Start(1435); Task.Run(Thread2); } void Thread2() { while (true) { Task.Delay(200).Wait(); if (server null) continue; server.PollEvents(); } } // 使用命名方法替代 lambda便于理解 private void OnConnectionRequestHandler(ConnectionRequest request) { try { request.AcceptIfKey(KEY20260601); ConnectionRequests.Enqueue(new ConnectionRequestMsg { RemoteEndPoint request.RemoteEndPoint?.ToString(), Timestamp DateTime.Now }); } catch { } ConnectionRequestEvent?.Invoke(request); } private void OnPeerConnectedHandler(NetPeer peer) { clients[peer.Id] peer; PeerConnectedMessages.Enqueue(new PeerConnectedMsg { Id peer.Id, EndPoint peer.Id.ToString(), Timestamp DateTime.Now }); PeerConnectedEvent?.Invoke(peer); } private void OnPeerDisconnectedHandler(NetPeer peer, DisconnectInfo info) { if (clients.ContainsKey(peer.Id)) clients.Remove(peer.Id); PeerDisconnectedMessages.Enqueue(new PeerDisconnectedMsg { Id peer.Id, Reason info.Reason.ToString(), Timestamp DateTime.Now }); PeerDisconnectedEvent?.Invoke(peer, info); } private void OnNetworkReceiveHandler(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod method) { MsgType type (MsgType)reader.GetByte(); byte[] data reader.GetRemainingBytes(); if (type MsgType.OBJ01) { Obj01Messages.Enqueue(MessagePackSerializer.DeserializeListOBJ01(data)); } else if (type MsgType.OBJ02) { Obj02Messages.Enqueue(MessagePackSerializer.DeserializeListOBJ02(data)); } reader.Recycle(); } public void Dispose() { server.Stop(); server null; listener null; clients.Clear(); } } // 事件消息对象 public class ConnectionRequestMsg { public string RemoteEndPoint { get; set; } public DateTime Timestamp { get; set; } } public class PeerConnectedMsg { public int Id { get; set; } public string EndPoint { get; set; } public DateTime Timestamp { get; set; } } public class PeerDisconnectedMsg { public int Id { get; set; } public string Reason { get; set; } public DateTime Timestamp { get; set; } } }using LiteNetLib; using LiteNetLib.Utils; using MessagePack; using System; using System.Collections.Generic; using System.Text; namespace LiteNetServer { partial class MT { public static void ps(ListBox listBox1, string text) { if (listBox1.InvokeRequired) { listBox1.Invoke(new Action(() listBox1.Items.Add([ DateTime.Now.ToString(HH:mm:ss) ] text))); } else { listBox1.Items.Add([ DateTime.Now.ToString(HH:mm:ss) ] text); } } public static void SendListToClientT(Dictionaryint, NetPeer clients, int clientid, MsgType msgType, ListT ObjList) { if (clients.TryGetValue(clientid, out NetPeer peer) peer.ConnectionState ConnectionState.Connected) { var writer new NetDataWriter(); writer.Put((byte)msgType); writer.Put(MessagePackSerializer.Serialize(ObjList)); peer.Send(writer, DeliveryMethod.ReliableOrdered); } else { } } } }using LiteNetLib.Utils; using MessagePack; using System; using System.Collections.Generic; using System.Text; namespace LiteNetServer { internal class MO { } // 必须加这个特性MessagePack 序列化用 [MessagePackObject] public class OBJ01 { // 用 Key 标记序列化顺序必须唯一 [Key(0)] public int id { get; set; } [Key(1)] public string aaa { get; set; } [Key(2)] public int x { get; set; } [Key(3)] public int y { get; set; } } [MessagePackObject] public class OBJ02 { [Key(0)] public int id { get; set; } [Key(1)] public string bbb { get; set; } [Key(2)] public int z { get; set; } } // 消息ID public enum MsgType : byte { OBJ01 1, OBJ02 2 } }

相关新闻

最新新闻

日新闻

周新闻

月新闻