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);
            }
        }
    }
}
相关推荐
半亩码田1 分钟前
C#转Python第3.6篇:Python 的 @property 比 C# 的 get/set 更灵活
java·python·c#
这个DBA有点耶8 分钟前
Redis大key“根治”指南:拆分策略与数据结构选型
数据库·mysql·架构
程序员与背包客_CoderZ16 分钟前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
进击的_鹏18 分钟前
从零开始的 Redis 学习
服务器·数据库·c++·redis·缓存
隔窗听雨眠34 分钟前
当KES遇到多租户:金仓数据库多租户架构的隔离实践与部署指南
数据库·架构
JOker_Chu_1 小时前
知识图谱详解:从图结构、关系建模到查询与应用
数据库·知识图谱·database·neo4j
tryCbest1 小时前
搭建企业知识库之Milvus 向量数据库
数据库·milvus
czhc11400756631 小时前
2026-08-24 博客:几个让你少踩坑的概念
数据库
ACP广源盛139246256732 小时前
Qwen3.8‑2.4T 开源落地@ACP#国产 Serdes 长距离视频传输芯片 GSV5800 在私有化 AI 服务中的价值与应用场景
大数据·数据库·人工智能·嵌入式硬件·矩阵·开源·音视频
oradh2 小时前
Oracle RMAN备份脚本、RMAN还原恢复测试、RMAN常用语句
数据库·oracle·rman备份脚本·rman还原恢复测试·rman常用语句