java获取域名Whois注册信息
2016-09-04 15:45
721 查看
域名简介
国别域名(ccTLD:Country Code Top Level Domain) 常见的有cn、im、me、tv、co、gg、ee、tt、bb等等通用顶级域名 (gTLD:generic Top Level Domain) 常见的有com、net、org等等
新顶级域名(New
Generic Top-level Domain)常见的有xin、top、xyz、wang、live等等
通过域名可以绑定到你的服务器ip,方便用户访问,做为网站的一个入口标志,一个好的域名可以
起到见域识意,给用户留下深刻的印象,方便下次访问,而不用通过其它搜索方式来找到网站的入口,
如csdn qq yy等。
Whois服务器
每个域名后缀都有自己的一个管理机构,每个管理机构都会开放自己的whois服务器,它以TCP的形式开放出来,开放端口为43,我们只要通过socket连接各个域名后缀的服务器,向它发送域名就可以返回相应的注册信息。
这里主要介绍两种方式实现域名注册信息的读取:
一、通过Java Socket 来实现。由于域名的后缀有上千种,每个域名后缀都有自己的whois服务器,可以通过配置的文件来获取相应的whois服务器地址
xin=whois.nic.xin top=whois.nic.top com=whois.corporatedomains.com net=whois.wildwestdomains.com org=whois.pir.org me=whois.nic.me
接下来我们可以封装一个工具来获取相应的服务器域名。
package util; import java.io.File; import java.io.FileInputStream; import java.util.NoSuchElementException; import java.util.Properties; /** * 注释 * * @Author: coding99 * @Date: 16-9-3 * @Time: 下午9:35 */ public class PropertiesLoader { private static final String PATH = PropertiesLoader.class.getResource("/").getPath()+"domain/domain.properties"; private final Properties properties; public PropertiesLoader() { properties = loadProperties(); } /** * 单例模式 */ private static class LazyHolder{ private static final PropertiesLoader INSTANCE = new PropertiesLoader(); } public static PropertiesLoader getInstance() { return LazyHolder.INSTANCE; } /** * 取出Property,但以System的Property优先,取不到返回空字符串. */ private String getValue(String key) { if (properties.containsKey(key)) { return properties.getProperty(key); } return ""; } /** * 取出String类型的Property,但以System的Property优先,如果都为Null则抛出异常. */ public String getProperty(String key) { String value = getValue(key); if (value == null) { throw new NoSuchElementException(); } return value; } /** * 载入多个文件, 文件路径使用Spring Resource格式. */ private Properties loadProperties() { File file = new File(PATH); // 生成文件输入流 FileInputStream inpf = null; try { inpf = new FileInputStream(file); } catch (Exception e) { e.printStackTrace(); } // 生成properties对象 Properties p = new Properties(); try { p.load(inpf); } catch (Exception e) { e.printStackTrace(); } return p; } }
连接whois服务器可以封装成一个工具类,这样方便使用时调用
package util; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; /** * 注释: 域名Whois查询工具 * * @Author: coding99 * @Date: 16-9-3 * @Time: 下午2:14 */ public class WhoisUtil { private static final int DEFAULT_PORT = 43;//连接默认端口43 /** * 单例模式 */ private static class LazyHolder { private static final WhoisUtil INSTANCE = new WhoisUtil(); } /** * 获取实例 * @return */ public static WhoisUtil getInstance() { return LazyHolder.INSTANCE; } /** * 查询域名 * @param domain * @return * @throws Exception */ public String queryDoamin(String domain,String server)throws Exception{ StringBuilder sb = new StringBuilder(); Socket socket = null; try { socket = new Socket(server, DEFAULT_PORT); String lineSeparator = "<br>"; PrintWriter out = new PrintWriter(socket.getOutputStream()); out.println(domain); out.flush(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line; while ((line = in.readLine()) != null) { sb.append(line + lineSeparator); } }catch (Exception e) { e.printStackTrace(); }finally { socket.close(); } return sb.toString(); } /** * 获取后缀 * @param domain */ public static String getTld(String domain) { final int index; String tld = ""; if(domain != null && !"".equals(domain) && (index = domain.lastIndexOf('.')+1) != 0) { tld = domain.substring(index); } return tld; } }
最后我们创建一个servlet就可以读取域名的注册信息啦。
package servlet; import util.PropertiesLoader; import util.WhoisUtil; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * 注释 * * @Author: coding99 * @Date: 16-9-3 * @Time: 下午8:49 */ public class DomainServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/json; charset=UTF-8"); String domain = req.getParameter("domain"); PrintWriter out = resp.getWriter(); String result = ""; /*判断域名是否合法*/ String tld = WhoisUtil.getTld(domain); String server = ""; if(tld == null || "".equals(tld)) { result = "{\"success\":false,\"msg\":\"域名输入不合法\",\"result\":\"\"}"; out.write(result); return; }else{ server = PropertiesLoader.getInstance().getProperty(tld); if (server == null || "".equals(server)) { result = "{\"success\":false,\"msg\":\"域名输入不合法\",\"result\":\"\"}"; out.write(result); return; } } WhoisUtil whoisUtil = WhoisUtil.getInstance(); try { String domainDetail = whoisUtil.queryDoamin(domain,server); if(domainDetail == null || "".equals(domainDetail)) { result = "{\"success\":false,\"msg\":\"域名查询有误,请重新再试!\",\"result\":\"\"}"; }else{ result = "{\"success\":true,\"msg\":\"\",\"result\":\""+domainDetail+"\"}"; } }catch (Exception e) { } out.write(result); } }
如果自己懒得写socket这部分,可以通过commons-net里面的WhoisClient来实现。没有什么太大的区别
二、软件来实现,由于whois服务器太多,为了方便自己操作,查询稳定,可以在linux安装一个whois软件,
然后通过脚本调用来实现获取whois信息(没有尝试过)
【附录A】目前的顶级域名及WHOIS服务器一览:
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- ICANN 推迟批准 .Org 交易
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序