Java如何在HTTP請求中做DNS決議?
- 前言
- 原始碼分析
- 測驗
前言
網路傳輸資料協議無非就是TCP和UDP,在做HTTP請求時,傳輸層就是基于TCP協議,如下代碼,其中的url引數就是統一資源定位器(Uniform Resource Locator),
HttpPost httpPost = new HttpPost(url);
當HTTP請求Web服務器資料介面時,如果給的引數(url)帶有服務器主機域名這種格式,必定通過DNS決議拿到Ip地址進而繼續開啟通道連接,那么如何進行決議的呢?下面通過原始碼分析的形式向大家展示,
原始碼分析
當請求連接時,才會使用Ip地址,因此我們將代碼定位到CloseableHttpClient類的doExecute方法上來,
protected abstract CloseableHttpResponse doExecute(HttpHost target, HttpRequest request,
HttpContext context) throws IOException, ClientProtocolException;
然后選擇該介面的實作類AbstractHttpClient,

看一下該類的UML圖,

深入到該類的doExecute方法中,可以的看到:
out = CloseableHttpResponseProxy.newProxy(
director.execute(target, request, execContext));
點擊execute方法,發現它實作了RequestDirector介面,我們再找其實作類DefaultRequestDirector,在方法中找到該代碼,我們也會總結,只有當連接的時候才會用到Ip地址,
tryConnect(roureq, context);
可以看到這行代碼,關鍵來了,該方法就是要開啟網路連接,
managedConn.open(route, context, params);
看該方法的實作類DefaultClientConnectionOperator,在該類的openConnection方法中有如下代碼,顧名思義,這就是決議域名的入口,
final InetAddress[] addresses = resolveHostname(target.getHostName());
看決議的實作類,來到了InetAddress,這個類想必都很明白了,是java.net包里的常用類,來到決議方法getAllByName0中,找到getAddressesFromNameService方法,
這個就是從域名服務器獲取Ip地址的方法,OK了,細節后面就自己看吧,
addresses = getAddressesFromNameService(host, reqAddr);
其實遇到網路相關的問題,應該首先能夠想到java.net包,網路程式開發離不開這個包,
測驗
查看百度域名的Ip地址如下代碼所示,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340605.html
標籤:其他
