之前使用dotnetty时 , 碰到了需要UDP通讯的问题 , 上网查询了一系列资料 , 并没有明确UDP该怎么使用的代码 . 自己下载了java netty的使用文档 , 再尝试一番后才试出dotnetty UDP通讯的方法 .
使用前直接在nuget程序包中搜索DotNetty添加引用.
初始化部分:
var group = new MultithreadEventLoopGroup();
IPEndPoint clientEndPoint = new IPEndPoint(IPAddress.Any, 8510);
IEventLoopGroup eventgrop = new MultithreadEventLoopGroup();
try
{
var bootstrap = new Bootstrap();
bootstrap
.Group(group)
.Channel<SocketDatagramChannel>() //UDP连接方式
.Option(ChannelOption.SoBroadcast, true) //广播形式获取数据
.Option(ChannelOption.SoReuseaddr, true) //可以复用端口号
.Handler(new ActionChannelInitializer<IChannel>(channel =>
{
IChannelPipeline pipeline = channel.Pipeline;
pipeline.AddLast(new LoggingHandler());
pipeline.AddLast(new TestHandler());
}));
channel = await bootstrap.BindAsync(clientEndPoint); //绑定本地端口号开始监听
if (!channel.Active)
{
await channel.CloseAsync();
}
在以上中 , 通过 .Channel() 和 .Option(ChannelOption.SoBroadcast, true) 配置来使用UDP通讯 , 下边是TextHandler的代码.
class TestHandler : SimpleChannelInboundHandler<DatagramPacket>
{
IChannelHandlerContext ctx;
public override bool IsSharable => true;
protected override void ChannelRead0(IChannelHandlerContext ctx, DatagramPacket packet)
{
var byteBuffer = packet.Content; //将收到的数据转换为IByteBuffer , 可通过ReadByte()方法读取单个byte类型 , 此外还有ReadInt() , ReadString()等.
}
public override void ChannelReadComplete(IChannelHandlerContext ctx)
{
ctx.Flush();
}
public override void ExceptionCaught(IChannelHandlerContext ctx, Exception e)
{
Console.WriteLine("{0}", e.ToString());
ctx.CloseAsync();
}
}
using DotNetty.Buffers;
using DotNetty.Transport.Channels;
using DotNetty.Transport.Channels.Sockets;
上述类使用这三个引用 , 将其加入就可以.
以上是dotnetty使用UDP的方法 , 在下也属于小白一枚 , 如不清楚地方可以留言讨论.