高性能 DotNetty Server Clinet Demo .NetCore

Nuget 引用

client 端

Install-Package DotNetty.Codecs  -Version 0.6.0
Install-Package DotNetty.Handlers -Version 0.6.0
Install-Package DotNetty.Transport -Version 0.6.0

Server端

Install-Package DotNetty.Codecs  -Version 0.6.0
Install-Package DotNetty.Transport -Version 0.6.0

服務端代碼

        static void Main(string[] args)
        {
            Server server = new Server();
            server.Listen(9999).Wait();
            Console.WriteLine("服務啓動");
            Console.ReadLine();
        }
    /// <summary>
    /// 服務
    /// </summary>
    public class Server
    {
        public async Task Listen(int port)
        {
            var boos = new MultithreadEventLoopGroup(1);
            var work = new MultithreadEventLoopGroup();

            var bootstrap = new ServerBootstrap();
            bootstrap.Group(boos, work)
                .Channel<TcpServerSocketChannel>()
                .Option(ChannelOption.SoBacklog, 100)
                .ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel=> {
                    IChannelPipeline pipeline = channel.Pipeline;

                    pipeline.AddLast(new ServerMessageHandler());
                }));
            IChannel boundChannel = await bootstrap.BindAsync(port);
        }
    }
    public class ServerMessageHandler : ChannelHandlerAdapter
    {
        public override void ChannelRead(IChannelHandlerContext context, object message)
        {
            var buffer = message as IByteBuffer;
            if (buffer != null)
            {
                string receiveData = buffer.ToString(Encoding.UTF8);
                Console.WriteLine("服務端獲取到:" + receiveData);
                byte[] messageBytes = Encoding.UTF8.GetBytes(receiveData);
                IByteBuffer byteBuffer = Unpooled.Buffer(256);
                byteBuffer.WriteBytes(messageBytes);
                context.WriteAndFlushAsync(byteBuffer);
            }
        }
        public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush();

        public override void ExceptionCaught(IChannelHandlerContext context, Exception exception)
        {
            context.CloseAsync();
        }
    }

客戶端代碼

        static void Main(string[] args)
        {
            Clinet clinet = new Clinet();
            clinet.Connect("127.0.0.1", 9999);
            Console.WriteLine("客戶端開始連接!");
            string content = "";
            while (!(content = Console.ReadLine()).Contains("Exit", StringComparison.InvariantCultureIgnoreCase))
            {
                clinet.SendMessage(content);
            }
            Console.ReadLine();
        }
    /// <summary>
    /// 客戶端
    /// </summary>
    public class Clinet
    {
        public static IChannel Channel { set; get; }
        public static IEventLoopGroup Group { set; get; }
        public static ClientMessageHandler clientMessageHandler = new ClientMessageHandler();
        public async void Connect(string host, int port)
        {
            Group = new MultithreadEventLoopGroup();

            var bootstrap = new Bootstrap();
            bootstrap
                .Group(Group)
                .Channel<TcpSocketChannel>()
                .Option(ChannelOption.TcpNodelay, true)
                .Handler(new ActionChannelInitializer<ISocketChannel>(channel =>
                {
                    IChannelPipeline pipeline = channel.Pipeline;
                    pipeline.AddLast(clientMessageHandler);
                }));
            Channel = await bootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(host), port));
        }
        public async void Close()
        {
            await Channel.CloseAsync();
            await Group.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1));
        }
        /// <summary>
        /// 發送消息
        /// </summary>
        /// <param name="message"></param>
        public bool SendMessage(string message)
        {
            if (message == null)
            {
                return false;
            }
            IByteBuffer buffer = Unpooled.Buffer(256);

            byte[] messageBytes = Encoding.UTF8.GetBytes(message);
            buffer.WriteBytes(messageBytes);
            Channel.WriteAndFlushAsync(buffer);

            return true;
        }
    }
    public class ClientMessageHandler : ChannelHandlerAdapter
    {
        public override void ChannelRead(IChannelHandlerContext context, object message)
        {
            var byteBuffer = message as IByteBuffer;

            if (byteBuffer != null)
            {
                var data = byteBuffer.ToString(Encoding.UTF8);
                Console.WriteLine("客戶端收到:" + data);
            }
        }

        public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush();

        public override void ExceptionCaught(IChannelHandlerContext context, Exception exception)
        {
            Console.WriteLine("Exception: " + exception);
            context.CloseAsync();
        }
    }

最後的效果

在這裏插入圖片描述

效果不錯,第一次學習,就搞出來了。加油。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章