Java 根據(jù)網(wǎng)址查詢DNS/IP地址的方法
需求: 給定一個URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析對應(yīng)的IP地址和端口號。
說明: 本文不涉及底層的 DNS 協(xié)議, 直接使用Java平臺提供的API進(jìn)行操作。
DNS也就是 Domain Name Service,即 域名服務(wù)。
我們知道, Java中與網(wǎng)址有關(guān)的類包括 java.net.URL 和 java.net.URI 等, 其中 URI 是資源定位符, 可能包括 file: 之類的協(xié)議。
所以此處我們使用 URL 類, 獲取端口號的代碼如下:
/**
* 獲取端口號
*
* @param href 網(wǎng)址, ftp, http, nntp, ... 等等
* @return
* @throws IOException
*/
public static int parsePort(String href) throws IOException {
//
URL url = new URL(href);
// 端口號; 如果 href 中沒有明確指定則為 -1
int port = url.getPort();
if (port < 0) {
// 獲取對應(yīng)協(xié)議的默認(rèn)端口號
port = url.getDefaultPort();
}
return port;
}
URL 類是Java早期就存在的一個類。 內(nèi)部邏輯比較復(fù)雜, 有興趣可以自己查看相關(guān)的JDK實(shí)現(xiàn)代碼。
其中獲取端口號的2個方法:
getPort() 就是獲取網(wǎng)址里面指明的端口號, 如果沒有指定, 則返回 -1。
getDefaultPort() 是獲取協(xié)議對應(yīng)的默認(rèn)端口號, 如 http 協(xié)議默認(rèn)端口號為 80, https 協(xié)議默認(rèn)端口號是 443 等。
然后我們看提取 Host 部分的代碼:
/**
* 獲取Host部分
*
* @param href 網(wǎng)址, ftp, http, nntp, ... 等等
* @return
* @throws IOException
*/
public static String parseHost(String href) throws IOException {
//
URL url = new URL(href);
// 獲取 host 部分
String host = url.getHost();
return host;
}
本質(zhì)上, 也可以通過正則表達(dá)式或者String直接截取 Host, 但如果碰上復(fù)雜情況, 也不好處理, 例如: https://yourname:passwd@gitee.com/mumu-osc/NiceFish.git 這樣的復(fù)雜網(wǎng)址。
提取出域名之后, 可以通過 java.net.InetAddress 類來查找IP地址。
代碼如下所示:
/**
* 根據(jù)域名(host)解析IP地址
*
* @param host 域名
* @return
* @throws IOException
*/
public static String parseIp(String host) throws IOException {
// 根據(jù)域名查找IP地址
InetAddress inetAddress = InetAddress.getByName(host);
// IP 地址
String address = inetAddress.getHostAddress();
return address;
}
可以看到,我們使用了 InetAddress.getByName() 靜態(tài)方法來查找IP。
該類也提供了其他靜態(tài)方法, 但一般不怎么使用, 有興趣可以點(diǎn)開源碼看看。
然后, 我們通過 main() 方法進(jìn)行簡單的測試:
public static void main(String[] args) throws IOException {
//
String ;
// 端口號
int port = parsePort(href);
// 域名
String host = parseHost(href);
// IP 地址
String address = parseIp(host);
//
System.out.println("host=" + host);
System.out.println("port=" + port);
System.out.println("address=" + address);
}
執(zhí)行結(jié)果為:
host=www.cncounter.com port=80 address=198.11.179.83
知道IP和端口號, 我們就可以直接通過 Socket 來進(jìn)行連接了。
當(dāng)然, 如果是 http 協(xié)議, 可以使用 Apache 的 HttpClient 工具, 功能強(qiáng)大而且使用方便。 但這個庫有個不好的地方在于,各個版本之間并不兼容, API 也經(jīng)常換, 編程時需要根據(jù)特定版本號來進(jìn)行處理。
完整的代碼如下所示:
import java.io.IOException;
import java.net.*;
/**
* 查找IP地址
*/
public class TestFindDNS {
public static void main(String[] args) throws IOException {
//
String ;
// 端口號
int port = parsePort(href);
// 域名
String host = parseHost(href);
// IP 地址
String address = parseIp(host);
//
System.out.println("host=" + host);
System.out.println("port=" + port);
System.out.println("address=" + address);
}
/**
* 獲取端口號
*
* @param href 網(wǎng)址, ftp, http, nntp, ... 等等
* @return
* @throws IOException
*/
public static int parsePort(String href) throws IOException {
//
URL url = new URL(href);
// 端口號; 如果 href 中沒有明確指定則為 -1
int port = url.getPort();
if (port < 0) {
// 獲取對應(yīng)協(xié)議的默認(rèn)端口號
port = url.getDefaultPort();
}
return port;
}
/**
* 獲取Host部分
*
* @param href 網(wǎng)址, ftp, http, nntp, ... 等等
* @return
* @throws IOException
*/
public static String parseHost(String href) throws IOException {
//
URL url = new URL(href);
// 獲取 host 部分
String host = url.getHost();
return host;
}
/**
* 根據(jù)域名(host)解析IP地址
*
* @param host 域名
* @return
* @throws IOException
*/
public static String parseIp(String host) throws IOException {
// 根據(jù)域名查找IP地址
InetAddress.getAllByName(host);
InetAddress inetAddress = InetAddress.getByName(host);
// IP 地址
String address = inetAddress.getHostAddress();
return address;
}
}
OK, 請根據(jù)具體情況進(jìn)行適當(dāng)?shù)姆庋b和處理。
總結(jié)
以上所述是小編給大家介紹的Java 根據(jù)網(wǎng)址查詢DNS/IP地址的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
java validation 后臺參數(shù)驗(yàn)證的使用詳解
本篇文章主要介紹了java validation 后臺參數(shù)驗(yàn)證的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
劍指Offer之Java算法習(xí)題精講字符串操作與數(shù)組及二叉搜索樹
跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化2022-03-03
Java?jar打包成exe應(yīng)用程序的詳細(xì)步驟
本文主要介紹了Java?jar打包成exe應(yīng)用程序的詳細(xì)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01

