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
-----------------------------------分 ------------------------------------隔 ------------------------------------线 --------------------------------------