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