您的位置:首页 > 编程语言 > Java开发

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 whois domain 域名