Java 根据网址查询DNS/IP地址的方法
需求:给定一个URL地址,例如:http://www.cncounter.com/tools/shorturl.php,解析对应的IP地址和端口号。
说明:本文不涉及底层的DNS协议,直接使用Java平台提供的API进行操作。
DNS也就是DomainNameService,即域名服务。
我们知道,Java中与网址有关的类包括java.net.URL和java.net.URI等,其中URI是资源定位符,可能包括file:之类的协议。
所以此处我们使用URL类,获取端口号的代码如下:
/** *获取端口号 * *@paramhref网址,ftp,http,nntp,...等等 *@return *@throwsIOException */ publicstaticintparsePort(Stringhref)throwsIOException{ // URLurl=newURL(href); //端口号;如果href中没有明确指定则为-1 intport=url.getPort(); if(port<0){ //获取对应协议的默认端口号 port=url.getDefaultPort(); } returnport; }
URL类是Java早期就存在的一个类。内部逻辑比较复杂,有兴趣可以自己查看相关的JDK实现代码。
其中获取端口号的2个方法:
getPort()就是获取网址里面指明的端口号,如果没有指定,则返回-1。
getDefaultPort()是获取协议对应的默认端口号,如http协议默认端口号为80,https协议默认端口号是443等。
然后我们看提取Host部分的代码:
/** *获取Host部分 * *@paramhref网址,ftp,http,nntp,...等等 *@return *@throwsIOException */ publicstaticStringparseHost(Stringhref)throwsIOException{ // URLurl=newURL(href); //获取host部分 Stringhost=url.getHost(); returnhost; }
本质上,也可以通过正则表达式或者String直接截取Host,但如果碰上复杂情况,也不好处理,例如:https://yourname:passwd@gitee.com/mumu-osc/NiceFish.git这样的复杂网址。
提取出域名之后,可以通过java.net.InetAddress类来查找IP地址。
代码如下所示:
/** *根据域名(host)解析IP地址 * *@paramhost域名 *@return *@throwsIOException */ publicstaticStringparseIp(Stringhost)throwsIOException{ //根据域名查找IP地址 InetAddressinetAddress=InetAddress.getByName(host); //IP地址 Stringaddress=inetAddress.getHostAddress(); returnaddress; }
可以看到,我们使用了InetAddress.getByName()静态方法来查找IP。
该类也提供了其他静态方法,但一般不怎么使用,有兴趣可以点开源码看看。
然后,我们通过main()方法进行简单的测试:
publicstaticvoidmain(String[]args)throwsIOException{ // Stringhref="http://www.cncounter.com/tools/shorturl.php"; //端口号 intport=parsePort(href); //域名 Stringhost=parseHost(href); //IP地址 Stringaddress=parseIp(host); // System.out.println("host="+host); System.out.println("port="+port); System.out.println("address="+address); }
执行结果为:
host=www.cncounter.com port=80 address=198.11.179.83
知道IP和端口号,我们就可以直接通过Socket来进行连接了。
当然,如果是http协议,可以使用Apache的HttpClient工具,功能强大而且使用方便。但这个库有个不好的地方在于,各个版本之间并不兼容,API也经常换,编程时需要根据特定版本号来进行处理。
完整的代码如下所示:
importjava.io.IOException; importjava.net.*; /** *查找IP地址 */ publicclassTestFindDNS{ publicstaticvoidmain(String[]args)throwsIOException{ // Stringhref="http://www.cncounter.com/tools/shorturl.php"; //端口号 intport=parsePort(href); //域名 Stringhost=parseHost(href); //IP地址 Stringaddress=parseIp(host); // System.out.println("host="+host); System.out.println("port="+port); System.out.println("address="+address); } /** *获取端口号 * *@paramhref网址,ftp,http,nntp,...等等 *@return *@throwsIOException */ publicstaticintparsePort(Stringhref)throwsIOException{ // URLurl=newURL(href); //端口号;如果href中没有明确指定则为-1 intport=url.getPort(); if(port<0){ //获取对应协议的默认端口号 port=url.getDefaultPort(); } returnport; } /** *获取Host部分 * *@paramhref网址,ftp,http,nntp,...等等 *@return *@throwsIOException */ publicstaticStringparseHost(Stringhref)throwsIOException{ // URLurl=newURL(href); //获取host部分 Stringhost=url.getHost(); returnhost; } /** *根据域名(host)解析IP地址 * *@paramhost域名 *@return *@throwsIOException */ publicstaticStringparseIp(Stringhost)throwsIOException{ //根据域名查找IP地址 InetAddress.getAllByName(host); InetAddressinetAddress=InetAddress.getByName(host); //IP地址 Stringaddress=inetAddress.getHostAddress(); returnaddress; } }
OK,请根据具体情况进行适当的封装和处理。
总结
以上所述是小编给大家介绍的Java根据网址查询DNS/IP地址的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!