LiteNetLib WinForm Demo

环境:VS2026, .Net10 , WinForm。豆包太厉害,几个小时引导我完成了这个Demo.

Server端代码:

cs 复制代码
using LiteNetLib;
using LiteNetLib.Utils;

namespace LiteNetServer
{
    public partial class Form1 : Form
    {

        // LiteNetLib 服务端
        private NetManager server;
        private EventBasedNetListener listener;
        private Dictionary<int, NetPeer> clients = new Dictionary<int, NetPeer>();


        public Form1()
        {
            InitializeComponent();

            if (server != null)
            {
                ps("服务器已启动!");
                return;
            }

            listener = new EventBasedNetListener();
            listener.ConnectionRequestEvent += OnConnectionRequest;
            listener.PeerConnectedEvent += OnPeerConnected;
            listener.PeerDisconnectedEvent += OnPeerDisconnected;
            listener.NetworkReceiveEvent += OnNetworkReceive;

            server = new NetManager(listener);
            server.Start(9050); // 端口

            ps("服务已启动,端口:" + 9050);

            Task.Run(Thread1);

        }


        private void button1_Click(object sender, EventArgs e)
        {
            if (clients.TryGetValue(int.Parse(textBox1.Text), out NetPeer peer) && peer.ConnectionState == ConnectionState.Connected)
            {
                NetDataWriter writer = new NetDataWriter();
                writer.Put(textBox2.Text);
                peer.Send(writer, DeliveryMethod.ReliableOrdered);
                ps("向客户端ID:" + textBox1.Text + " 发送:" + textBox2.Text);
            }
            else
            {
                ps("无法发送给客户端ID:" + textBox1.Text);
            }
        }

        void Thread1()
        {
            while (true)
            {
                Task.Delay(200).Wait();
                server?.PollEvents();
            }
        }

        // 连接请求
        private void OnConnectionRequest(ConnectionRequest request)
        {
            request.AcceptIfKey("KEY20260601");
            ps("收到客户端连接请求");
        }

        // 客户端连接
        private void OnPeerConnected(NetPeer peer)
        {
            clients[peer.Id] = peer;
            ps("客户端已连接,ID:" + peer.Id);
        }

        // 客户端断开
        private void OnPeerDisconnected(NetPeer peer, DisconnectInfo info)
        {
            if (clients.ContainsKey(peer.Id))
                clients.Remove(peer.Id);

            ps("客户端断开,ID:" + peer.Id + " 原因:" + info.Reason);
        }

        // 接收消息
        private void OnNetworkReceive(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod method)
        {
            string msg = reader.GetString();
            ps("收到客户端消息,ID:" + peer.Id + ": " + msg);
        }


        // 安全添加日志(跨线程)
        private void ps(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);
            }
        }


    }
}

Client端代码:

cs 复制代码
using LiteNetLib;
using LiteNetLib.Utils;
using Microsoft.VisualBasic.Logging;

namespace LiteNetClient
{
    public partial class Form1 : Form
    {
        private NetManager client;
        private EventBasedNetListener listener;
        private NetPeer peer;

        public Form1()
        {
            InitializeComponent();

            if (client != null)
            {
                ps("已经连接!");
                return;
            }

            listener = new EventBasedNetListener();
            listener.PeerConnectedEvent += OnConnected;
            listener.PeerDisconnectedEvent += OnDisconnected;
            listener.NetworkReceiveEvent += OnReceive;

            client = new NetManager(listener);
            client.Start();

            // 连接本地服务器(IP 127.0.0.1 端口 9050)
            peer = client.Connect("127.0.0.1", 9050, "KEY20260601");
            ps("正在连接服务器...");

            Task.Run(Thread1);

        }
        private void button1_Click(object sender, EventArgs e)
        {

            if (peer == null || peer.ConnectionState != ConnectionState.Connected)
            {
                ps("未连接服务器!");
                return;
            }

            NetDataWriter writer = new NetDataWriter();
            writer.Put(textBox1.Text);
            peer.Send(writer, DeliveryMethod.ReliableOrdered);
            ps("发送:" + textBox1.Text);

        }

        void Thread1()
        {
            while (true)
            {
                Task.Delay(200).Wait();
                client?.PollEvents();
            }
        }

        // 连接成功
        private void OnConnected(NetPeer peer)
        {
            ps("连接服务器成功!");
        }

        // 断开连接
        private void OnDisconnected(NetPeer peer, DisconnectInfo info)
        {
            ps("断开连接:" + info.Reason);
        }

        // 收到消息
        private void OnReceive(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod method)
        {
            string msg = reader.GetString();
            ps("收到:" + msg);
        }


        private void ps(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);
            }
        }
    }
}
相关推荐
唐青枫3 小时前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
Nturmoils3 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
咕白m6257 小时前
.NET 环境下 Word 超链接批量提取方案
c#·.net
渣波7 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
用户91721561902117 小时前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠1 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
倔强的石头_1 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库
唐青枫3 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech3 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
倔强的石头_4 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库