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地址的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!