`
sjsky
  • 浏览: 925800 次
  • 性别: 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的源码结构清晰,遵循了面向...

    TCP/IP技术大全(中文PDF非扫描版)

    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的...

    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 是一个网络查询服务,用于检索域名注册信息,包括域名持有者的信息。这个...

Global site tag (gtag.js) - Google Analytics