`
sjsky
  • 浏览: 921675 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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<br>
     * 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<String> queryInfoListByWhois(String ipOrDomain) {
        Socket qrySocket = null;
        BufferedReader br = null;
        PrintStream ps = null;
        int qryCount = 0;
        List<String> infoList = new ArrayList<String>();
        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<String, String> queryInfoMapByWhois(String ipOrDomain) {

        List<String> infoList = this.queryInfoListByWhois(ipOrDomain);
        Map<String, String> infoMap = new LinkedHashMap<String, String>();
        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"<br>
         * "180.168.130.146<br>
         * iteye.com<br>
         * AS9808
         */
        String ipOrDomain = "129.42.58.216";
        Map<String, String> map = handler.queryInfoMapByWhois(ipOrDomain);

        for (Entry<String, String> 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<String, String> map = new LinkedHashMap<String, String>();
        try {
            WhoisBean bean = new WhoisBean();
            bean.setTimeout(0);
            // bean.setServer("whois.apnic.net");
            bean.setServer("whois.ripe.net");
            bean.queryInfoByIp(ip);

            List<String> 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<String, String> 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<String> infoList = new ArrayList<String>();

    /**
     * @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<String> getInfoList() {
        return infoList;
    }

    /**
     * @param pInfoList the infoList to set
     */
    public void setInfoList(List<String> 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.
***              <http://www.iana.org/assignments/ipv4-address-space>
***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.
              <http://www.iana.org/assignments/ipv4-address-space>
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



-----------------------------------分 ------------------------------------隔 ------------------------------------线 --------------------------------------
1
1
分享到:
评论

相关推荐

    java_whois.rar

    这个Java_whois项目提供了一个简单易用的接口,可以集成到其他Java应用程序中,方便开发者快速实现WHOIS查询功能。使用这个工具,你需要具备以下几个方面的知识: 1. **Java基础知识**:Java是一种广泛使用的面向...

    [主机域名]PHP+AJAX的whois查询程序_whois.rar

    【标题】"PHP+AJAX的whois查询程序"是一个基于Web的系统,它结合了PHP和AJAX技术,用于实现快速、实时的域名whois查询功能。在互联网上,whois查询是获取有关域名注册信息的重要手段,包括注册者信息、注册日期、...

    WhoisThisDomain v2.40.zip

    WhoisThisDomain是一款小巧好用...软件界面美观简洁、简单全面、实用方便,可快速上手,轻轻松松完成日常域名注册信息查询功能,真正做到简单全面实用。是用户实现域名注册信息查询功能的好帮手。 WhoisThisDomain截图

    commons-net-1.4.1-src

    7. WhoisClient:实现了WHOIS查询协议,用于查询互联网域名和IP地址的相关信息。 8. SocketUtils:包含了一系列关于Socket操作的静态方法,如打开、关闭、绑定、监听等,简化了Socket编程。 9. Echo,Daytime,...

    commons-net-3.6.rar

    7. WHOIS:实现了WHOIS查询协议,用于查找互联网域名和IP地址的相关信息。 8. Time protocols:包括NTP(网络时间协议)和Daytime协议的实现,可以获取准确的网络时间。 9. Socket utilities:提供了一些通用的套...

    commons-net-3.6-bin.tar

    7.WhoisClient:提供WHOIS查询功能,常用于域名信息查询。 8.POP3Client和IMAPClient:实现了POP3和IMAP协议,方便开发者处理电子邮件。 除了这些客户端,Apache Commons Net还提供了许多辅助类,如IP地址处理、...

    commons-net-3.6.1.1-bin.zip

    此外,Commons Net 还包含一些其他网络工具,如WHOIS查询、NNTP检索、Telnet客户端等,这些工具可以帮助开发者实现各种网络通信功能。 在实际开发中,Apache Commons Net 提供的API简洁易用,具有良好的文档支持。...

    commons-net-3.6

    - **Whois查询**:查询域名和IP地址的相关信息。 - **TFTP协议**:简单文件传输协议的实现。 - **TCP实用工具**:如端口扫描和连接测试。 总的来说,Apache Commons Net 3.6是一个强大而全面的网络编程工具集,适用...

    activate-jdbc_2.10-1.5-M4.zip

    它提供了一种统一的方式来连接、查询和操作数据库,使得开发跨平台的数据库应用变得简单。 3. **RDAP(Registration Data Access Protocol)**:理解RDAP的关键在于它的作用,即提供一种标准方法来查询和获取互联网...

    jar包-commons-net-3.3.jar

    7. **Whois**:用于查询Whois服务器,获取域名、IP地址等相关信息。 8. **Time protocols**:如NTP(Network Time Protocol)和SNTP(Simple Network Time Protocol),用于同步网络中的时间。 9. **Multicast**:...

    commons net

    8. **Whois**:提供Whois查询功能,可用于获取域名或IP地址的相关信息,如注册者、注册日期等。 9. **Arp**:提供了ARP(地址解析协议)查询的功能,可以获取局域网内的物理地址。 在实际开发中,Apache Commons ...

    commons-net-1.4.1-src.zip

    7. WHOIS:查询域名注册信息的协议,通过`WhoisClient`类实现。 8. Net_Utils:这个模块包含了一些通用的网络工具函数,如IP地址处理、端口扫描等。 源码分析: Apache Commons Net的源码结构清晰,遵循了面向...

    commons-net源码包

    5. **其他网络协议**:除了上述协议,还有如TFTP(简单文件传输协议)、WHOIS和Time协议的实现,这些都在相应的包下。 6. **异步网络编程**:Apache Commons Net支持非阻塞I/O,通过`org.apache.commons.net.io`...

    email-verification:查询Whois XML Api的Email Verification API服务的代码示例

    使用电子邮件验证API网络服务 是用于电子邮件地址验证的简单... 在这里,您将找到查询以多种语言实现的API的示例。 您将需要一个进行身份验证。 请参考《以获取有关输入参数,请求/响应格式,身份验证说明等的信息。

    commons-net-1.4.1.jar

    7. **Whois协议**: 能够查询域名注册信息和其他Whois记录。 8. **TCP utilities**: 包含如TCP连接管理、IP地址转换和端口扫描等实用工具类。 9. **Multicast support**: 支持多播通信,可以在多个目的地之间广播...

    网络安全基础知识之侦察与工具

    Whois 命令是获取网络信息的基本工具,它可以查询互联网上主机或域名的注册信息,包括管理员联系信息、DNS服务器等。结合 nslookup,可以进一步探测网络结构,如通过假装为二级DNS服务器请求区域传输,从而获取大量...

    commons-net-3.2

    使用Apache Commons Net库时,开发者可以通过简单的API调用来实现复杂的网络任务,大大简化了开发过程。例如,通过FTPClient类,只需几行代码就可以实现文件的上传和下载。同时,由于库中的类和方法设计良好,可读性...

    网络安全的侦测和工具.pdf

    例如,Perl 常用于编写用于处理数据和文本文件的脚本,而 C/C++ 由于其接近硬件和性能效率高的特点,常用于开发安全工具和协议实现。 Whois 是一个网络查询服务,用于检索域名注册信息,包括域名持有者的信息。这个...

    TCP/IP教程TCP/IP基础

    2.3.1 Whois和Finger 14 2.3.2 文件传输协议 14 2.3.3 Telnet 14 2.3.4 Email 14 2.3.5 WWW 14 2.3.6 USENET News 15 2.4 Intranet和Extranet概览 15 2.4.1 Intranet 15 2.4.2 将Intranet对外开放 16 2.5 Internet的...

Global site tag (gtag.js) - Google Analytics