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");
}
}