目录
- 简介
- 搭建netty服务器
- DNS服务器的消息处理
- DNS客户端消息请求
- 总结
那么DNS Server是否可以用netty实现呢?
答案当然是肯定的,但是之前也讲过了DNS中有很多DnsRecordType,所以如果想实现全部的支持类型可能并现实,这里我们就以最简单和最常用的A类型为例,用netty来实现一下DNS的TCP服务器 。
搭建netty服务器因为是TCP请求,所以这里使用基于NIO的netty server服务,也就是NioEventLoopGroup和NioServerSocketChannel,netty服务器的代码如下:
EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); ServerBootstrap bootstrap = new ServerBootstrap().group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new Do53ServerChannelInitializer()); final Channel channel = bootstrap.bind(dnsServerPort).channel(); channel.closeFuture().sync();因为是服务器,所以我们需要两个EventLoopGroup,一个是bossGroup,一个是workerGroup 。
将这两个group传递给ServerBootstrap,并指定channel是NioServerSocketChannel,然后添加自定义的Do53ServerChannelInitializer即可 。
Do53ServerChannelInitializer中包含了netty自带的tcp编码解码器和自定义的服务器端消息处理方式 。
这里dnsServerPort=53,也是默认的DNS服务器的端口值 。
DNS服务器的消息处理Do53ServerChannelInitializer是我们自定义的initializer,里面为pipline添加了消息的处理handler:
class Do53ServerChannelInitializer extends ChannelInitializer<Channel> { @Override protected void initChannel(Channel ch) throws Exception { ch.pipeline().addLast( new TcpDnsQueryDecoder(), new TcpDnsResponseEncoder(), new Do53ServerInboundHandler()); }}这里我们添加了两个netty自带的编码解码器,分别是TcpDnsQueryDecoder和TcpDnsResponseEncoder 。
对于netty服务器来说,接收到的是ByteBuf消息,为了方便服务器端的消息读取,需要将ByteBuf解码为DnsQuery,这也就是TcpDnsQueryDecoder在做的事情 。
public final class TcpDnsQueryDecoder extends LengthFieldBasedFrameDecoderTcpDnsQueryDecoder继承自LengthFieldBasedFrameDecoder,也就是以字段长度来区分对象的起始位置 。这和TCP查询传过来的数据结构是一致的 。
经验总结扩展阅读
- MySQL该使用哪种CPU架构服务器?
- Pwn学习随笔
- 微信用过的小程序怎么找回 使用过小程序怎么找回
- mac小辣椒适合黄皮的人使用吗?
- 教你如何练出胸肌 如何练出胸肌
- vivo怎么看每天手机使用时间 vivo手机怎么看一天用手机时长
- 冰箱1-7档哪个最冷 使用冰箱档位的注意事项有哪些
- 空调除湿模式耗电量大吗 空调除湿模式的使用方法有哪些
- 保温材料有哪些 使用保温材料的注意事项有哪些
- 榆木家具刷漆好还是木蜡油 木蜡油使用要注意什么