使用WHOIS協(xié)議查詢Internet域名
發(fā)表時(shí)間:2023-08-19 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]中國(guó)建設(shè)銀行云南省保山地區(qū)分行 楊紹方當(dāng)我們準(zhǔn)備建立一個(gè)Web站點(diǎn),就必須向域名登記機(jī)構(gòu)申請(qǐng)一個(gè)Internet域名,因此,我們通常希望了解自己準(zhǔn)備使用的域名是否已經(jīng)被注冊(cè),這時(shí),可以簡(jiǎn)單地訪問(wèn)In...
中國(guó)建設(shè)銀行云南省保山地區(qū)分行 楊紹方
當(dāng)我們準(zhǔn)備建立一個(gè)Web站點(diǎn),就必須向域名登記機(jī)構(gòu)申請(qǐng)一個(gè)Internet域名,因此,我們通常希望了解自己準(zhǔn)備使用的域名是否已經(jīng)被注冊(cè),這時(shí),可以簡(jiǎn)單地訪問(wèn)InterNIC站點(diǎn)http://www.internic.net/whois.html,在"Registry Whois"輸入框中輸入需查詢的域名,就可以得到我們需要的結(jié)果。本文介紹了如何使用Java編程來(lái)實(shí)現(xiàn)這個(gè)過(guò)程。
一 原理
原理非常簡(jiǎn)單,域名的查詢主要是基于RFC 954提供的WHOIS協(xié)議。在上述過(guò)程中,我們實(shí)際上是訪問(wèn)了InterNIC站點(diǎn)的WHOIS服務(wù)器,該服務(wù)器從WHOIS數(shù)據(jù)庫(kù)中查詢我們所需要的內(nèi)容。
WHOIS服務(wù)器是一個(gè)基于"查詢/響應(yīng)"的TCP事務(wù)服務(wù)器,它運(yùn)行在SRI-NIC機(jī)器上(26.0.0.73或10.0.0.51),向用戶提供internet范圍內(nèi)的目錄服務(wù)。本地主機(jī)上的用戶程序可以通過(guò)Internet訪問(wèn)該服務(wù)器,其過(guò)程主要有下面三步:
(1)在TCP服務(wù)端口43(十進(jìn)制)連接SRI-NIC服務(wù)主機(jī);
(2)發(fā)送一個(gè)命令,以回車和換行(<CRLF>)結(jié)尾;
(3)接受相應(yīng)命令的返回信息,一旦輸出結(jié)束,服務(wù)器將關(guān)閉連接。
命令的格式非常簡(jiǎn)單。可以直接輸入域名,例如,可以使用"sohu.com"查詢"搜狐"網(wǎng)站的域名信息;也可以使用"help"得到詳細(xì)的幫助信息。
二 Java socket編程簡(jiǎn)述
在Java中,使用Socket類可以實(shí)現(xiàn)客戶端的sockets,建立與服務(wù)器的網(wǎng)絡(luò)連接。本文使用下面所示的Socket類的構(gòu)造器來(lái)創(chuàng)建一個(gè)流socket,并連接到主機(jī)"whois.internic.net"的端口43。
public Socket(String host, int port, boolean stream) throws IOException
其中,參數(shù)host為遠(yuǎn)程主機(jī)的主機(jī)名,port為遠(yuǎn)程主機(jī)的端口號(hào),如果參數(shù)stream為true,則創(chuàng)建一個(gè)流socket,否則創(chuàng)建一個(gè)數(shù)據(jù)報(bào)socket。
如果創(chuàng)建socket時(shí)發(fā)生I/O錯(cuò)誤,將拋擲一個(gè)IOException 異常。
當(dāng)創(chuàng)建了一個(gè)連接到遠(yuǎn)程主機(jī)的socket對(duì)象后,我們可以使用getInputStream()和getOutputStream()方法分別得到該socket對(duì)象的輸入流和輸出流,用于對(duì)該socket進(jìn)行數(shù)據(jù)讀寫,為了使應(yīng)用程序設(shè)計(jì)簡(jiǎn)單,這些方法返回的流通常使用java.io包中的實(shí)例對(duì)象來(lái)處理,例如:DataInputStream和PrintWriter。
從socket讀數(shù)據(jù)使用readline()方法,一次讀取一行數(shù)據(jù)(字符串):
public String readLine() throws IOException
向socket寫數(shù)據(jù)使用print()方法:
public void print(String s)
當(dāng)完成socket通訊后,應(yīng)該首先關(guān)閉DataInputStream和PrintWriter對(duì)象,最后才關(guān)閉socket對(duì)象。
三 源程序
import java.net.*;
import java.io.*;
public class whois
{
public final static int port = 43;
public final static String hostname = "whois.internic.net";
public static void main(String[] args)
{
Socket theSocket;
DataInputStream theWhoisStream;
PrintStream ps;
//檢查命令行參數(shù)
if (args.length <1)
{
System.out.println("\nUsage: java whois <command>");
System.out.println("Parameters:");
System.out.println(
"\tcommand = one or more Domain name, or other command.");
System.out.println("Example:");
System.out.println("\tjava whois sohu.com");
System.out.println("\tjava whois help");
System.exit(1); //退出
}
try {
//在TCP服務(wù)端口43(十進(jìn)制)連接SRI-NIC服務(wù)主機(jī)
theSocket = new Socket(hostname, port, true);
ps = new PrintStream(theSocket.getOutputStream());
//發(fā)送用戶提供的一個(gè)或多個(gè)命令
for (int i = 0; i < args.length; i++)
ps.print(args[i] + " ");
//以回車和換行(<CRLF>)結(jié)尾
ps.print("\r\n");
//接受相應(yīng)命令的返回信息
theWhoisStream = new DataInputStream(theSocket.getInputStream());
String s;
while ((s = theWhoisStream.readLine()) != null) {
System.out.println(s);
}
//關(guān)閉DataInputStream和PrintWriter
theWhoisStream.close();
ps.close();
//關(guān)閉socket
theSocket.close();
}
catch (IOException e) {
System.err.println(e);
}
}
}
whois.java利用JDK1.2編譯通過(guò),在Windows 98/NT的命令行提示符運(yùn)行的方法為:
java whois < Internet域名或命令>
例如,查詢"搜狐"的Internet域名信息可以:
java whois sohu.com
得到詳細(xì)的幫助可以:
java whois help
您可以發(fā)現(xiàn),屏幕輸出的內(nèi)容與使用瀏覽器訪問(wèn)http://www.internic.net/whois.html得到的內(nèi)容完全一樣。