# DotNetty.Extensions **Repository Path**: znyet/DotNetty.Extensions ## Basic Information - **Project Name**: DotNetty.Extensions - **Description**: DotNetty.Extensions for tcp、udp、webSocket both server and client - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 11 - **Created**: 2020-01-06 - **Last Updated**: 2025-07-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DotNetty.Extensions Base On DotNetty # For Tcp、Udp、WebSocket Both Server And Client ##### ### TcpServer ```csharp using DotNetty.Buffers; using DotNetty.Codecs; using DotNetty.Extensions; using DotNetty.Transport.Channels; using System.Net; using System.Text; var server = new TcpSocketServer(8000); server.OnCreateBootstrap += bootstrap => { bootstrap.Option(ChannelOption.TcpNodelay, true); }; server.OnChannelPipeline += pipeline => { //心跳 //pipeline.AddLast(new IdleStateHandler(60, 0, 0)); //编码解码器 pipeline.AddLast(new LengthFieldPrepender(2)); pipeline.AddLast(new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2)); pipeline.AddLast(new MyStringDecoder()); //tls证书 //var cert = new X509Certificate2(Path.Combine(ExampleHelper.ProcessDirectory, "dotnetty.com.pfx"), "password"); //pipeline.AddLast(TlsHandler.Server(cert)); }; server.OnStarting += () => { Console.WriteLine("Starting..."); }; server.OnStarted += () => { Console.WriteLine("Started."); }; server.OnStopped += async ex => { Console.WriteLine($"Stopped==>{ex?.Message}"); await Task.Delay(2000); await server.StartAsync(); //restart }; server.OnClientConnected += cnn => { var addr = (IPEndPoint)cnn.Channel.RemoteAddress; Console.WriteLine($"ClientConnected==>{cnn.Id}==>IP:{addr.Address}==>Port:{addr.Port}"); Console.WriteLine($"ClientCount:{server.ClientDict.Count}"); }; server.OnClientMessage += async (cnn, message) => { if (message is IByteBuffer buffer) { var txt = buffer.ToString(Encoding.UTF8); Console.WriteLine($"ClientMessage==>{cnn.Id}===>{txt}"); } else if (message is string str) { Console.WriteLine($"ClientMessage==>{cnn.Id}===>{str}"); } var txtSend = Encoding.UTF8.GetBytes("this is from tcp server message!"); await cnn.WriteAndFlushAsync(txtSend); }; server.OnClientException += (cnn, ex) => { Console.WriteLine($"ClientException==>{cnn.Id}==>{ex?.Message}"); }; server.OnClientDisconnected += cnn => { Console.WriteLine($"ClientDisconnected==>{cnn.Id}"); Console.WriteLine($"ClientCount:{server.ClientDict.Count}"); }; await server.StartAsync(); Console.ReadKey(); await server.DisposeAsync(); Console.WriteLine("Hello, World!"); public class MyStringDecoder : MessageToMessageDecoder { protected override void Decode(IChannelHandlerContext ctx, IByteBuffer message, List output) { // 直接将IByteBuffer转为字符串 output.Add(message.ToString(Encoding.UTF8)); } } ``` ### TcpClient ```csharp using DotNetty.Buffers; using DotNetty.Codecs; using DotNetty.Extensions; using DotNetty.Transport.Channels; using System.Text; var client = new TcpSocketClient("127.0.0.1", 8000); client.OnChannelPipeline += pipeline => { //心跳 //pipeline.AddLast(new IdleStateHandler(5, 0, 0)); //编码解码器 pipeline.AddLast(new LengthFieldPrepender(2)); pipeline.AddLast(new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2)); pipeline.AddLast(new MyStringDecoder()); //tls证书 //var cert = new X509Certificate2(Path.Combine(ExampleHelper.ProcessDirectory, "dotnetty.com.pfx"), "password"); //var targetHost = cert.GetNameInfo(X509NameType.DnsName, false); //pipeline.AddLast(new TlsHandler(stream => new SslStream(stream, true, (sender, certificate, chain, errors) => true), new ClientTlsSettings(targetHost))); }; client.OnConnecting += () => { Console.WriteLine("Connecting..."); }; client.OnConnected += async () => { Console.WriteLine("Connected."); var txt = Encoding.UTF8.GetBytes("this is from tcp client message!"); await client.WriteAndFlushAsync(txt); }; client.OnMessage += message => { if (message is IByteBuffer buffer) { var txt = buffer.ToString(Encoding.UTF8); Console.WriteLine($"Message==>{txt}"); } else if (message is string str) { Console.WriteLine($"Message==>{str}"); } }; client.OnException += ex => { Console.WriteLine($"Exception=>{ex?.Message}"); }; client.OnDisconnected += async () => { Console.WriteLine("Disconnected."); await Task.Delay(2000); await client.ConnectAsync(); //reconnect }; await client.ConnectAsync(); Console.ReadKey(); await client.DisposeAsync(); Console.WriteLine("Hello, World!"); public class MyStringDecoder : MessageToMessageDecoder { protected override void Decode(IChannelHandlerContext ctx, IByteBuffer message, List output) { // 直接将IByteBuffer转为字符串 output.Add(message.ToString(Encoding.UTF8)); } } ``` ### UDP ```csharp using DotNetty.Extensions; using System.Net; using System.Text; var udp = new UdpSocket(8888); udp.OnStarting += () => { Console.WriteLine("Starting..."); }; udp.OnStarted += async () => { Console.WriteLine("Started."); var endPoint = new IPEndPoint(IPAddress.Broadcast, 7777); var bytes = Encoding.UTF8.GetBytes("this is from UDP2 message!"); await udp.WriteAndFlushAsync(endPoint, bytes); await udp.WriteAndFlushAsync("127.0.0.1:7777", bytes); }; udp.OnStopped += async ex => { Console.WriteLine($"Stopped==>{ex?.Message}"); await Task.Delay(2000); await udp.StartAsync(); //reconnect }; udp.OnException += ex => { Console.WriteLine($"Exception==>{ex?.Message}"); }; udp.OnMessage += (endPoint, bytes) => { Console.WriteLine(endPoint); Console.WriteLine(Encoding.UTF8.GetString(bytes)); }; await udp.StartAsync(); Console.ReadKey(); await udp.DisposeAsync(); Console.WriteLine("Hello, World!"); ``` ### WebSocketServer ```csharp using DotNetty.Extensions; using System.Net; using System.Text; var server = new WebSocketServer(8000); //server.Path = "/kkk"; server.OnChannelPipeline += pipeline => { //心跳 //pipeline.AddLast(new IdleStateHandler(60, 0, 0)); //tls证书 //var cert = new X509Certificate2(Path.Combine(ExampleHelper.ProcessDirectory, "dotnetty.com.pfx"), "password"); //pipeline.AddLast(TlsHandler.Server(cert)); }; server.OnStarting += () => { Console.WriteLine("Starting..."); }; server.OnStarted += () => { Console.WriteLine("Started."); }; server.OnStopped += async ex => { Console.WriteLine($"Stopped==>{ex?.Message}"); await Task.Delay(2000); await server.StartAsync(); //restart }; server.OnClientConnected += cnn => { var addr = (IPEndPoint)cnn.Channel.RemoteAddress; Console.WriteLine($"ClientConnected==>{cnn.Id}==>IP:{addr.Address}==>Port:{addr.Port}"); Console.WriteLine($"ClientCount:{server.ClientDict.Count}"); }; server.OnClientTextMessage += async (cnn, message) => { Console.WriteLine($"ClientTextMessage==>{cnn.Id}===>{message}"); await cnn.WriteAndFlushAsync("this is from websocket server text message!"); }; server.OnClientBinaryMessage += async (cnn, bytes) => { var txt = Encoding.UTF8.GetString(bytes); Console.WriteLine($"ClientBinaryMessage==>{cnn.Id}===>{txt}"); var bs = Encoding.UTF8.GetBytes("this is from websocket server binary message!"); await cnn.WriteAndFlushAsync(bs); }; server.OnClientException += (cnn, ex) => { Console.WriteLine($"ClientException==>{cnn.Id}==>{ex?.Message}"); }; server.OnClientDisconnected += cnn => { Console.WriteLine($"ClientDisconnected==>{cnn.Id}"); Console.WriteLine($"ClientCount:{server.ClientDict.Count}"); }; await server.StartAsync(); Console.ReadKey(); await server.DisposeAsync(); Console.WriteLine("Hello, World!"); ``` ### WebSocketClient ```csharp using DotNetty.Extensions; using System.Text; var client = new WebSocketClient("ws://127.0.0.1:8000"); client.OnChannelPipeline += pipeline => { //心跳 //pipeline.AddLast(new IdleStateHandler(5, 0, 0)); //tls证书 //var cert = new X509Certificate2(Path.Combine(ExampleHelper.ProcessDirectory, "dotnetty.com.pfx"), "password"); //var targetHost = cert.GetNameInfo(X509NameType.DnsName, false); //pipeline.AddLast(new TlsHandler(stream => new SslStream(stream, true, (sender, certificate, chain, errors) => true), new ClientTlsSettings(targetHost))); }; client.OnConnecting += () => { Console.WriteLine("Connecting..."); }; client.OnConnected += async () => { Console.WriteLine("Connected."); await client.WriteAndFlushAsync("this is from websocket client text message!"); var bs = Encoding.UTF8.GetBytes("this is from websocket client binary message!"); await client.WriteAndFlushAsync(bs); }; client.OnTextMessage += message => { Console.WriteLine($"TextMessage==>{message}"); }; client.OnBinaryMessage += message => { var txt = Encoding.UTF8.GetString(message); Console.WriteLine($"BinaryMessage==>{txt}"); }; client.OnException += ex => { Console.WriteLine($"Exception=>{ex?.Message}"); }; client.OnDisconnected += async () => { Console.WriteLine("Disconnected."); await Task.Delay(2000); await client.ConnectAsync(); //reconnect }; await client.ConnectAsync(); Console.ReadKey(); await client.DisposeAsync(); Console.WriteLine("Hello, World!"); ``` ### TcpSocketServer Libuv ```csharp using DotNetty.Buffers; using DotNetty.Codecs; using DotNetty.Extensions; using DotNetty.Transport.Channels; using System.Net; using System.Text; var server = new TcpSocketServerLibuv(8000); server.OnCreateBootstrap += bootstrap => { bootstrap.Option(ChannelOption.TcpNodelay, true); }; server.OnChannelPipeline += pipeline => { //心跳 //pipeline.AddLast(new IdleStateHandler(60, 0, 0)); //编码解码器 pipeline.AddLast(new LengthFieldPrepender(2)); pipeline.AddLast(new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2)); //tls证书 //var cert = new X509Certificate2(Path.Combine(ExampleHelper.ProcessDirectory, "dotnetty.com.pfx"), "password"); //pipeline.AddLast(TlsHandler.Server(cert)); }; server.OnStarting += () => { Console.WriteLine("Starting..."); }; server.OnStarted += () => { Console.WriteLine("Started."); }; server.OnStopped += async ex => { Console.WriteLine($"Stopped==>{ex?.Message}"); await Task.Delay(2000); await server.StartAsync(); //restart }; server.OnClientConnected += cnn => { var addr = (IPEndPoint)cnn.Channel.RemoteAddress; Console.WriteLine($"ClientConnected==>{cnn.Id}==>IP:{addr.Address}==>Port:{addr.Port}"); Console.WriteLine($"ClientCount:{server.ClientDict.Count}"); }; server.OnClientMessage += async (cnn, message) => { var buffer = (IByteBuffer)message; var txt = buffer.ToString(Encoding.UTF8); Console.WriteLine($"ClientMessage==>{cnn.Id}===>{txt}"); var txtSend = Encoding.UTF8.GetBytes("this is from tcp server message!"); await cnn.WriteAndFlushAsync(txtSend); }; server.OnClientException += (cnn, ex) => { Console.WriteLine($"ClientException==>{cnn.Id}==>{ex?.Message}"); }; server.OnClientDisconnected += cnn => { Console.WriteLine($"ClientDisconnected==>{cnn.Id}"); Console.WriteLine($"ClientCount:{server.ClientDict.Count}"); }; await server.StartAsync(); Console.ReadKey(); await server.DisposeAsync(); Console.WriteLine("Hello, World!"); ``` ### WebSocketServer Libuv ```csharp using DotNetty.Extensions; using System.Net; using System.Text; var server = new WebSocketServerLibuv(8000); //server.Path = "/kkk"; server.OnChannelPipeline += pipeline => { //心跳 //pipeline.AddLast(new IdleStateHandler(60, 0, 0)); //tls证书 //var cert = new X509Certificate2(Path.Combine(ExampleHelper.ProcessDirectory, "dotnetty.com.pfx"), "password"); //pipeline.AddLast(TlsHandler.Server(cert)); }; server.OnStarting += () => { Console.WriteLine("Starting..."); }; server.OnStarted += () => { Console.WriteLine("Started."); }; server.OnStopped += async ex => { Console.WriteLine($"Stopped==>{ex?.Message}"); await Task.Delay(2000); await server.StartAsync(); //restart }; server.OnClientConnected += cnn => { var addr = (IPEndPoint)cnn.Channel.RemoteAddress; Console.WriteLine($"ClientConnected==>{cnn.Id}==>IP:{addr.Address}==>Port:{addr.Port}"); Console.WriteLine($"ClientCount:{server.ClientDict.Count}"); }; server.OnClientTextMessage += async (cnn, message) => { Console.WriteLine($"ClientTextMessage==>{cnn.Id}===>{message}"); await cnn.WriteAndFlushAsync("this is from websocket server text message!"); }; server.OnClientBinaryMessage += async (cnn, bytes) => { var txt = Encoding.UTF8.GetString(bytes); Console.WriteLine($"ClientBinaryMessage==>{cnn.Id}===>{txt}"); var bs = Encoding.UTF8.GetBytes("this is from websocket server binary message!"); await cnn.WriteAndFlushAsync(bs); }; server.OnClientException += (cnn, ex) => { Console.WriteLine($"ClientException==>{cnn.Id}==>{ex?.Message}"); }; server.OnClientDisconnected += cnn => { Console.WriteLine($"ClientDisconnected==>{cnn.Id}"); Console.WriteLine($"ClientCount:{server.ClientDict.Count}"); }; await server.StartAsync(); Console.ReadKey(); await server.DisposeAsync(); Console.WriteLine("Hello, World!"); ```