查看: 1157|回复: 0

[技术分享] [Java][网络程序开发]《DNS服务简单实现》

[复制链接]
累计签到:205 天
连续签到:1 天

47

主题

88

回帖

1万

积分

版主

酒诡

名望
800
星币
2699
星辰
15
好评
353

夜猫子勋章实习版主勋章优秀会员奖明星会员奖魅力会员奖欢乐天使奖鼎力支持奖幸运猪版主勋章灌水天才奖在线大神星辰勋章星座专属勋章五一勋章热心助人奖

发表于 2023-10-21 22:45:54 | 显示全部楼层 |阅读模式

注册登录后全站资源免费查看下载

您需要 登录 才可以下载或查看,没有账号?立即注册

×

项目使用了Netty高性能网络通信框架。
使用了4.1.X版本
启动后,就可以使用该服务器作为DNS服务器。
  1. public class Dns {

  2.     public static void main(String[] args) {
  3.         final NioEventLoopGroup group = new NioEventLoopGroup();
  4.         try {
  5.             Bootstrap bootstrap = new Bootstrap();
  6.             bootstrap.group(group).channel(NioDatagramChannel.class)
  7.                     .handler(new ChannelInitializer<NioDatagramChannel>() {
  8.                         @Override
  9.                         protected void initChannel(NioDatagramChannel nioDatagramChannel) throws Exception {
  10.                             nioDatagramChannel.pipeline().addLast(new DatagramDnsQueryDecoder());
  11.                             nioDatagramChannel.pipeline().addLast(new DatagramDnsResponseEncoder());
  12.                             nioDatagramChannel.pipeline().addLast(new DnsHandler());
  13.                         }
  14.                     }).option(ChannelOption.SO_BROADCAST, true);

  15.             ChannelFuture future = bootstrap.bind(53).sync();
  16.             future.channel().closeFuture().sync();
  17.         } catch (InterruptedException e) {
  18.             e.printStackTrace();
  19.         } finally {
  20.             group.shutdownGracefully();
  21.         }
  22.     }
  23. }

  24. class DnsHandler extends SimpleChannelInboundHandler<DatagramDnsQuery> {
  25.     @Override
  26.     public void channelRead0(ChannelHandlerContext ctx, DatagramDnsQuery query) throws UnsupportedEncodingException {
  27.         // 假数据,域名和ip的对应关系应该放到数据库中
  28.         Map<String, byte[]> ipMap = new HashMap<>();
  29.         ipMap.put("www.cnhongker.net.", new byte[] { 74, 121, (byte) 149, (byte)218 });
  30.         DatagramDnsResponse response = new DatagramDnsResponse(query.recipient(), query.sender(), query.id());
  31.         try {
  32.             DefaultDnsQuestion dnsQuestion = query.recordAt(DnsSection.QUESTION);
  33.             response.addRecord(DnsSection.QUESTION, dnsQuestion);
  34.             System.out.println("查询的域名:" + dnsQuestion.name());

  35.             ByteBuf buf = null;
  36.             if (ipMap.containsKey(dnsQuestion.name())) {
  37.                 buf = Unpooled.wrappedBuffer(ipMap.get(dnsQuestion.name()));
  38.             } else {
  39.                 // TODO  对于没有的域名采用迭代方式
  40.                 // buf = Unpooled.wrappedBuffer(new byte[] { 127, 0, 0, 1});
  41.             }
  42.             // TTL设置为10s, 如果短时间内多次请求,客户会使用本地缓存
  43.             DefaultDnsRawRecord queryAnswer = new DefaultDnsRawRecord(dnsQuestion.name(), DnsRecordType.A, 10, buf);
  44.             response.addRecord(DnsSection.ANSWER, queryAnswer);

  45.         } catch (Exception e) {
  46.             System.out.println("异常了:" + e);
  47.         }finally {
  48.             ctx.writeAndFlush(response);
  49.         }
  50.     }

  51.     @Override
  52.     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  53.         cause.printStackTrace();
  54.     }
  55. }
复制代码
好兄弟,来局紧张刺激的CSGO吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|偏爱技术社区-偏爱技术吧-源码-科学刀-我爱辅助-娱乐网--教开服-游戏源码

偏爱技术社区-偏爱技术吧-源码-科学刀-我爱辅助-娱乐网-游戏源码

Powered by Discuz! X3.5

GMT+8, 2024-12-28 03:38 , Processed in 0.079942 second(s), 33 queries .

快速回复 返回顶部 返回列表