免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

netty系列之: 在netty中使用 tls 協(xié)議請(qǐng)求 DNS 服務(wù)器( 二 )


sslContext.newHandler(ch.alloc(), dnsServer, dnsPort)newHandler還需要指定dnsServer和dnsPort信息 。
處理完ssl,接下來就是對(duì)dns查詢和響應(yīng)的編碼解碼器,這里使用的是TcpDnsQueryEncoder和TcpDnsResponseDecoder 。
TcpDnsQueryEncoder和TcpDnsResponseDecoder在之前介紹使用netty搭建tcp客戶端的時(shí)候就已經(jīng)詳細(xì)解說過了,這里就不再進(jìn)行講解了 。
編碼解碼之后,就是自定義的消息處理器DotChannelInboundHandler:
class DotChannelInboundHandler extends SimpleChannelInboundHandler<DefaultDnsResponse>DotChannelInboundHandler中定義了消息的具體處理方法:
private static void readMsg(DefaultDnsResponse msg) {if (msg.count(DnsSection.QUESTION) > 0) {DnsQuestion question = msg.recordAt(DnsSection.QUESTION, 0);log.info("question is :{}", question);}int i = 0, count = msg.count(DnsSection.ANSWER);while (i < count) {DnsRecord record = msg.recordAt(DnsSection.ANSWER, i);if (record.type() == DnsRecordType.A) {//A記錄用來指定主機(jī)名或者域名對(duì)應(yīng)的IP地址DnsRawRecord raw = (DnsRawRecord) record;log.info("ip address is: {}",NetUtil.bytesToIpAddress(ByteBufUtil.getBytes(raw.content())));}i++;}}讀取的邏輯很簡(jiǎn)單,先從DefaultDnsResponse中讀取QUESTION,打印出來,然后再讀取它的ANSWER,因?yàn)檫@里是A address,所以調(diào)用NetUtil.bytesToIpAddress方法將ANSWER轉(zhuǎn)換為ip地址打印出來 。
最后我們可能得到這樣的輸出:
INFOc.f.dnsdot.DotChannelInboundHandler - question is :DefaultDnsQuestion(www.flydean.com. IN A)INFOc.f.dnsdot.DotChannelInboundHandler - ip address is: 47.107.98.187TLS的客戶端請(qǐng)求我們創(chuàng)建好channel之后,就需要向DNS server端發(fā)送查詢請(qǐng)求了 。因?yàn)槭荄oT,那么和普通的TCP查詢有什么區(qū)別呢?
答案是并沒有什么區(qū)別,因?yàn)門LS的操作SslHandler我們已經(jīng)在handler中添加了 。所以這里的查詢和普通查詢沒什么區(qū)別 。
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();}同樣我們需要構(gòu)建一個(gè)DnsQuery,這里使用的是DefaultDnsQuery,通過傳入一個(gè)randomID和opcode即可 。
因?yàn)槭遣樵?,所以這里的opcode是DnsOpCode.QUERY 。
然后需要向QUESTION section中添加一個(gè)DefaultDnsQuestion,用來查詢具體的域名和類型 。
這里的queryDomain是www.flydean.com,查詢類型是A,表示的是對(duì)域名進(jìn)行IP解析 。
最后將得到的query,寫入到channel中即可 。
總結(jié)這里我們使用netty構(gòu)建了一個(gè)基于TLS的DNS查詢客戶端,除了添加TLS handler之外,其他操作和普通的TCP操作類似 。但是要注意的是,要想客戶端可以正常工作,我們需要請(qǐng)求支持DoT協(xié)議的DNS服務(wù)器才可以 。
本文的代碼,大家可以參考:
learn-netty4
【netty系列之: 在netty中使用 tls 協(xié)議請(qǐng)求 DNS 服務(wù)器】

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀