1. 引入DotNetty包
我用的开发工具是VS2022,不同工具引入可能会有差异
工具——>NuGet包管理器——>管理解决方案的NuGet程序包
搜索DotNetty
2.新建EchoClientHandler.cs类
用于接收服务器返回数据
public class EchoClientHandler : SimpleChannelInboundHandler<IByteBuffer> { /// <summary> /// Read0是DotNetty特有的对于Read方法的封装 /// 封装实现了: /// 1. 返回的message的泛型实现 /// 2. 丢弃非该指定泛型的信息 /// </summary> /// <param name="ctx"></param> /// <param name="msg"></param> protected override void ChannelRead0(IChannelHandlerContext ctx, IByteBuffer msg) { if (msg != null) { Console.WriteLine("Receive From Server:" + msg.ToString(Encoding.UTF8)); } //ctx.WriteAsync(Unpooled.CopiedBuffer(msg)); } public override void ChannelReadComplete(IChannelHandlerContext context) { context.Flush(); } public override void ChannelActive(IChannelHandlerContext context) { Console.WriteLine("==================ChannelActive======================"); //context.WriteAndFlushAsync(Unpooled.CopiedBuffer(Encoding.UTF8.GetBytes("Hello World!"))); } public override void ChannelInactive(IChannelHandlerContext context) { Console.WriteLine("===============ChannelInactive=============="); base.ChannelInactive(context); context.CloseAsync(); } public override void ExceptionCaught(IChannelHandlerContext context, Exception exception) { Console.WriteLine("===============ExceptionCaught=============="); Console.WriteLine(exception); context.CloseAsync(); } }
复制
3.新建DotNettyClient.cs客户端类
public class DotNettyClient { private MultithreadEventLoopGroup group; private Bootstrap bootstrap; private IChannel channel; public async Task StartAsync() { group = new MultithreadEventLoopGroup(); try { bootstrap = new Bootstrap() .Group(group) .Channel<TcpSocketChannel>() .Option(ChannelOption.TcpNodelay, true) .Handler(new ActionChannelInitializer<ISocketChannel>(channel => { IChannelPipeline pipeline = channel.Pipeline; pipeline.AddLast(new StringDecoder(Encoding.UTF8)); pipeline.AddLast(new StringEncoder(Encoding.UTF8)); pipeline.AddLast(new IdleStateHandler(0, 0, 600)); pipeline.AddLast(new EchoClientHandler()); })); channel = await bootstrap.ConnectAsync("127.0.0.1", 9997); //byte[] bytes = Encoding.UTF8.GetBytes("aaaaa"); //await channel.WriteAndFlushAsync(Unpooled.WrappedBuffer(bytes)); Console.WriteLine("Connected to server."); // 发送消息给服务器 SendMessage("我是客户端"); //关闭客户端连接 //await channel.CloseAsync(); //Console.WriteLine("Client connection closed."); } catch (Exception ex) { Console.WriteLine(ex.ToString()); Console.WriteLine(ex.StackTrace); } finally { await group.ShutdownGracefullyAsync(); } } public void SendMessage(string message) { if (channel != null && channel.Open) { Console.WriteLine("666666666666666666666666666"); channel.WriteAndFlushAsync(message); Console.WriteLine("Sent message to server: " + message); } } }
复制
4.使用DotNetty
我这里是窗体应用程序
public partial class Form1 : Form { public Form1() { InitializeComponent(); startClient(); } public async Task startClient() { DotNettyClient client = new DotNettyClient(); await client.StartAsync();//连接服务 //client.SendMessage("111111111111111"); } }
复制