netty系列之: 在netty中使用 tls 协议请求 DNS 服务器( 二 )

读取的逻辑很简单 , 先从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.187TLS的客户端请求我们创建好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 服务器】

推荐阅读