Java实现简单whois查询

阅读更多
    blog迁移至: http://www.micmiu.com

利用Java socket 实现whois信息的查询功能
【一】、第二版主要做了以下修改
  • 合并成一个简单的实现类
  • 修正换行内容合并的bug
  • 修正有关多个“:”解析的bug

具体代码如下:WhoisQueryHandler.java
package michael.socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * whois查询
 * @author michael
 * @see http://sjsky.iteye.com
 */
public class WhoisQueryHandler {
    /**
     * whois.apnic.net
* whois.ripe.net */ private String server = "whois.ripe.net"; /** * port */ private int port = 43; /** * timeout/minute */ private int timeout = 0; /** * @return the server */ public String getServer() { return server; } /** * @return the port */ public int getPort() { return port; } /** * @return the timeout */ public int getTimeout() { return timeout; } /** * @param pServer the server to set */ public void setServer(String pServer) { server = pServer; } /** * @param pPort the port to set */ public void setPort(int pPort) { port = pPort; } /** * @param pTimeout the timeout to set */ public void setTimeout(int pTimeout) { timeout = pTimeout; } /** * @param ipOrDomain * @return List */ public List queryInfoListByWhois(String ipOrDomain) { Socket qrySocket = null; BufferedReader br = null; PrintStream ps = null; int qryCount = 0; List infoList = new ArrayList(); infoList.add("查询的对象:" + ipOrDomain); while (qryCount < 3) { qryCount++; try { qrySocket = new Socket(server, port); qrySocket.setSoTimeout(timeout * 1000); ps = new PrintStream(qrySocket.getOutputStream()); ps.println(ipOrDomain); br = new BufferedReader(new InputStreamReader(qrySocket .getInputStream())); String readLine = null; int lineCount = 0; System.out.println("Whois query start.... "); while ((readLine = br.readLine()) != null && lineCount < 100) { System.out.println("readLine [" + readLine + "]"); if ("".equals(readLine) || readLine.charAt(0) == '%') { continue; } lineCount++; infoList.add(readLine); } System.out.println("whois query info finish"); break; } catch (Exception e) { e.printStackTrace(); } finally { if (null != br) { try { br.close(); } catch (Exception e1) { } } if (null != ps) { try { ps.close(); } catch (Exception e1) { } } if (null != qrySocket) { try { qrySocket.close(); } catch (Exception e1) { } } } } return infoList; } /** * @param ipOrDomain * @return List */ public Map queryInfoMapByWhois(String ipOrDomain) { List infoList = this.queryInfoListByWhois(ipOrDomain); Map infoMap = new LinkedHashMap(); String key = ""; String value = ""; for (String info : infoList) { if (info.startsWith(" ") || info.indexOf(':') == -1) { value = info; } else { key = info.substring(0, info.indexOf(':')); value = info.substring(info.indexOf(':') + 1); } if (null == infoMap.get(key)) { infoMap.put(key, value); } else { infoMap.put(key, infoMap.get(key) + value); } } return infoMap; } /** * @param args */ public static void main(String[] args) { WhoisQueryHandler handler = new WhoisQueryHandler(); /** * "218.202.224.2"
* "180.168.130.146
* iteye.com
* AS9808 */ String ipOrDomain = "129.42.58.216"; Map map = handler.queryInfoMapByWhois(ipOrDomain); for (Entry entry : map.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); } } }


【一】、第一版:
第一版的源代码直接下载: java_whois.zip
具体的代码实现如下:
WhoisQuery.java
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 
 * @author Michael sun
 */
public class WhoisQuery {

    /**
     * 
     * @param ip
     */
    private void queryIpInfo(String ip) {

        Map map = new LinkedHashMap();
        try {
            WhoisBean bean = new WhoisBean();
            bean.setTimeout(0);
            // bean.setServer("whois.apnic.net");
            bean.setServer("whois.ripe.net");
            bean.queryInfoByIp(ip);

            List infoList = bean.getInfoList();
            String value = "";
            String key = "";
            for (String infoTmp : infoList) {
                String[] arr = infoTmp.split(":[ ]*");
                if (arr.length > 1) {
                    key = arr[0];
                    value = arr[1];
                } else {
                    value = arr[0].trim();
                }
                if (null == map.get(key)) {
                    map.put(key, "");
                }
                value = map.get(key) + value;
                map.put(key, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        for (Entry entry : map.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());

        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        String ip = "129.42.58.216";// "163.1.13.189";
        WhoisQuery query = new WhoisQuery();
        query.queryIpInfo(ip);

    }

}

WhoisBean.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 * WhoisBean
 * @author Michael sun
 */
public class WhoisBean {

    /**
     * server address
     */
    private String server = "";

    /**
     * port
     */
    private int port = 43;

    /**
     * timeout/minute
     */
    private int timeout = 0;

    /**
     * infoList
     */
    private List infoList = new ArrayList();

    /**
     * @param ip
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public void queryInfoByIp(String ip) throws Exception {
        Socket theSocket = null;
        BufferedReader br = null;
        PrintStream ps = null;
        int qryCount = 0;
        while (qryCount < 5) {
            qryCount++;
            try {
                theSocket = new Socket(server, port);
                theSocket.setSoTimeout(timeout * 1000);

                ps = new PrintStream(theSocket.getOutputStream());
                ps.println(ip);
                br = new BufferedReader(new InputStreamReader(theSocket
                        .getInputStream()));
                infoList.add("ip:" + ip);
                String readLine = "";
                int i = 0;
                System.out.println("Whois  query read  start.... ");
                while ((readLine = br.readLine()) != null) {
                    System.out.println("***" + readLine);
                    if (readLine.length() > 0 && readLine.charAt(0) != '%') {
                        infoList.add(readLine);
                        i++;
                        // 默认读取100行数据
                        if (i > 100 || readLine.startsWith("source")) {
                            break;
                        }
                    }
                }
                System.out.println("querylist size:" + infoList.size());
                break;
            } catch (Exception e) {
                System.out.println("EXCEPTION : " + e);
            } finally {
                if (null != br) {
                    br.close();
                }
                if (null != ps) {
                    ps.close();
                }
                if (null != theSocket) {
                    theSocket.close();
                }
            }
        }
    }

    /**
     * @return the server
     */
    public String getServer() {
        return server;
    }

    /**
     * @return the port
     */
    public int getPort() {
        return port;
    }

    /**
     * @return the timeout
     */
    public int getTimeout() {
        return timeout;
    }

    /**
     * @param pServer the server to set
     */
    public void setServer(String pServer) {
        server = pServer;
    }

    /**
     * @param pPort the port to set
     */
    public void setPort(int pPort) {
        port = pPort;
    }

    /**
     * @param pTimeout the timeout to set
     */
    public void setTimeout(int pTimeout) {
        timeout = pTimeout;
    }

    /**
     * @return the infoList
     */
    public List getInfoList() {
        return infoList;
    }

    /**
     * @param pInfoList the infoList to set
     */
    public void setInfoList(List pInfoList) {
        infoList = pInfoList;
    }
}

运行WhoisQuery这个类就可以看到如下信息:
Whois  query read  start.... 
***% This is the RIPE Database query service.
***% The objects are in RPSL format.
***%
***% The RIPE Database is subject to Terms and Conditions.
***% See http://www.ripe.net/db/support/db-terms-conditions.pdf
***
***% Note: This output has been filtered.
***%       To receive output for a database update, use the "-B" flag.
***
***% Information related to '129.0.0.0 - 129.255.255.255'
***
***inetnum:      129.0.0.0 - 129.255.255.255
***netname:      EU-ZZ-129
***descr:        Various Registries
***country:      EU # Country is really world wide
***remarks:      These addresses were issued by
***              The IANA before the formation of
***              Regional Internet Registries.
***              
***org:          ORG-NCC1-RIPE
***admin-c:      iana1-RIPE
***tech-c:       iana1-RIPE
***status:       ALLOCATED UNSPECIFIED
***mnt-by:       RIPE-NCC-HM-MNT
***mnt-lower:    RIPE-NCC-HM-MNT
***mnt-routes:   RIPE-NCC-RPSL-MNT
***source:       RIPE # Filtered
querylist size:17
ip:129.42.58.216
inetnum:129.0.0.0 - 129.255.255.255
netname:EU-ZZ-129
descr:Various Registries
country:EU # Country is really world wide
remarks:These addresses were issued byThe IANA before the formation ofRegional Internet Registries.
              
org:ORG-NCC1-RIPE
admin-c:iana1-RIPE
tech-c:iana1-RIPE
status:ALLOCATED UNSPECIFIED
mnt-by:RIPE-NCC-HM-MNT
mnt-lower:RIPE-NCC-HM-MNT
mnt-routes:RIPE-NCC-RPSL-MNT
source:RIPE # Filtered



-----------------------------------分 ------------------------------------隔 ------------------------------------线 --------------------------------------
  • java_whois.zip (1.8 KB)
  • 下载次数: 79

你可能感兴趣的:(Java,Socket,whois,apnic)