读取的逻辑很简单 , 先从DefaultDnsResponse中读取QUESTION,打印出来 , 然后再读取它的ANSWER,因为这里是A address,所以调用NetUtil.bytesToIpAddress方法将ANSWER转换为ip地址打印出来 。
最后我们可能得到这样的输出:
INFOc.f.dnsdot.DotChannelInboundHandler - question is :DefaultDnsQuestion(www.flydean.com. IN A)INFOc.f.dnsdot.DotChannelInboundHandler - ip address is: 47.107.98.187
TLS的客户端请求我们创建好channel之后,就需要向DNS server端发送查询请求了 。因为是DoT,那么和普通的TCP查询有什么区别呢?
答案是并没有什么区别 , 因为TLS的操作SslHandler我们已经在handler中添加了 。所以这里的查询和普通查询没什么区别 。
int randomID = (int) (System.currentTimeMillis() / 1000);DnsQuery query = new DefaultDnsQuery(randomID, DnsOpCode.QUERY).setRecord(DnsSection.QUESTION, new DefaultDnsQuestion(queryDomain, DnsRecordType.A));ch.writeAndFlush(query).sync();boolean result = ch.closeFuture().await(10, TimeUnit.SECONDS);if (!result) {log.error("DNS查询失败");ch.close().sync();}
同样我们需要构建一个DnsQuery,这里使用的是DefaultDnsQuery,通过传入一个randomID和opcode即可 。
因为是查询 , 所以这里的opcode是DnsOpCode.QUERY 。
然后需要向QUESTION section中添加一个DefaultDnsQuestion,用来查询具体的域名和类型 。
这里的queryDomain是www.flydean.com,查询类型是A,表示的是对域名进行IP解析 。
最后将得到的query,写入到channel中即可 。
总结这里我们使用netty构建了一个基于TLS的DNS查询客户端,除了添加TLS handler之外,其他操作和普通的TCP操作类似 。但是要注意的是,要想客户端可以正常工作,我们需要请求支持DoT协议的DNS服务器才可以 。
本文的代码,大家可以参考:
learn-netty4
【netty系列之: 在netty中使用 tls 协议请求 DNS 服务器】
推荐阅读
- 明日之后热晶实验室奇遇任务的完成方法是什么
- 【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列
- 死磕面试系列,Java到底是值传递还是引用传递?
- 之七 2流高手速成记:基于Dubbo&Nacos的微服务简要实现
- 金铲铲之战巨岩龙羁绊效果是什么样
- 哈利波特:魔法觉醒黑暗之息时装怎么获取
- 明日之后怎么可以一直玩(明日之后新手建议玩吗)
- 网吧怎么玩明日之后(网吧怎么登录明日之后pc)
- 怎么玩好明日之后(明日之后从零开始教程)
- 低配电脑怎么玩明日之后(电脑如何玩明日之后)