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);
            }
        }
    }
}
相关推荐
Lyyaoo.1 小时前
【MySQL】索引
数据库·mysql
i220818 Faiz Ul1 小时前
民谣网站|基于Springboot的民谣网站管理系统(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·民谣网站
摇滚侠1 小时前
JDBC 基础到高级一套通关!基础篇 00-15
java·开发语言·数据库
Amnesia0_01 小时前
MYSQL操作
数据库·mysql
兆。1 小时前
LangChain实验跟踪集成指南:面向ML研究员
数据库·langchain
zhojiew1 小时前
DuckLake湖仓数据格式常用操作实践以及和Iceberg的对比
数据库
万粉变现经纪人1 小时前
2026最新CSDN博客质量分v6.0深度解读:从评分机制到80+实战提分指南
数据库·人工智能·深度学习·csdn·csdn博客·csdn博客质量分6.0·博客质量分
曹牧2 小时前
Oracle:嵌套子查询
数据库·oracle
王莎莎-MinerU2 小时前
Agent 时代,科学数据 API 需要重新设计
大数据·前端·数据库·人工智能·个人开发