程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用Java來實現域名和IP地址轉換的操作

使用Java來實現域名和IP地址轉換的操作

編輯:關於JAVA

對我們普通用戶而言,形象化的符號要比一捆枯燥的數字編碼要好記得多。比如,我們會很容易地記住字符串“www.oscar.com”,卻很難記住206.17.191.12。本文簡要地介紹了Internet命名規則和地址的劃分約定,然後介紹了如何利用Java語言完成符號名(上面的字符串)和IP地址(上面的數字串)之間的轉換工作,並給出一個實例,檢查可訪問的遠程主機。

Internet命名規則和地址劃分約定

在Internet上,符號名(symbolic Name)用來命名主機和網絡,例如www.bianceng.cn。這些符號名的“學名”叫做“Domain Name”,即域名。雖然域名對我們來說方便得多,但在它們用作通信標識之前,必須轉換為IP地址(Internet Protocol Address)。IP地址是一個32位的標識符,包括一個網絡標識和主機標識,以便唯一地標識主機和網絡。域名轉換為IP地址的工作是由專門的系統完成,這就是域名系統(Domain Name System??DNS)。

同一網絡或不同網絡主機之間進行數據的發送/接收時,IP地址就開始起作用了。如果是同一網絡中主機之間的數據傳遞,則僅利用IP地址中的主機標識,來確定網絡中主機的所在。另一方面,如果是不同網絡中主機之間的通信,則要同時利用主機標識和網絡標識來確定相應的主機。定位網絡和主機,再進行數據傳送的過程稱為路由(routing)。網絡中的路由器(router)包含一個IP層(IP Layer),它負責執行路由算法,將數據包發送到目的地。在Internet上,將數據庫發送到目的地是IP層份內之事。

IP地址是Internet注冊部門??Network Information Center(網絡信息中心??NIC)分配給不同的組織,各組織再下放給多個部門。IP地址要占用4個字節。

經過路由的數據包,也有可能會在傳送的過程中丟失。於是,人們就利用底層傳輸協議,來進行數據傳送正確與否的判斷。例如,TCP用於檢查錯誤或數據丟失,並在出錯時,再次發送相應的數據庫,直至對方主機正確接收為止。

目前,共計有3類(或3個級別)的IP地址:A類、B類和C類。另外,還有一類IP地址叫作“Multicast”,在某些Internet主機上使用。這些不同類別的IP地址滿足了不同組織的需要。例如,A類地址主要用於主機數目超過65536的大型網絡系統;B類地址則用於中型網絡系統,其主機數大於255,卻小於65536;C類地址則用於那些主機數量小於256的小型網絡。

不同類別地址的十進制表示如下,其中的十進制數代表允許的地址范圍:

A類

網絡ID 主機ID

1~127 0~255 0~255 0~255

B類

網絡ID 主機ID

128~191 0~255 0~255 0~255

C類

網絡ID 主機ID

191~233 0~255 0~255 0~254

Multicast

191~233 0~255 0~255 0~254

數字0和255另有特殊的含意。數字0是為那些地址不明的主機保留的。某些情況下,如錯誤的系統配置,主機標識或網絡標識不明的情況也會發生。例如,某個主機的C類地址為0.0.0.42,則說明其主機標識為42,而它所處網絡的網絡標識則是“未知數”0。?

數字255則用於廣播發送方式,即一台主機發出的信息會傳送到網絡中所有的主機上。

獲得IP地址

為了獲得所在網絡的IP地址,或者網絡中其他主機的IP地址,我們可以用java.net軟件包中的java.net.InetAddress類加以實現。例如,如果我們希望得到所在網絡的IP地址,我們可以調用InetAddress類中的getLocalHost()和getAddress()方法。getLocalHost()返回一個InetAddress對象;而getAddress()則返回一個長度為4的字節數組(IP地址為4個字節)。?

如果要編制一個基於網絡的應用程序,我們也許需要知道准備運行這個程序的主機的域名或IP地址。如果這個程序只在我們自己的主機上運行,而且我們也知道主機的域名或IP地址,則我們就可以這樣進行:定義一個字符串常量即可,如:string localHost=“my-machine-name”。但大多情況下,我們編制

/*
* Program:sample1.java
*/
import java.net.*/;
public class GetName {
public static void main (String argv〔〕) throws Exception {
InetAddress host=null;
host=InetAddress.getLocalHost();
System.out.println(host.getHostName());
}}

的程序將在不同的主機上運行,這樣才有實用價值。那麼,象上面那樣,定義一個localHost常量的方法就不太好用了。我們希望應用程序能夠自動檢測得到當前主機的域名。下面的程序說明了如何完成這一工作。

InetAddress是java.net軟件開發包中的一個“現成”的類。在上面的代碼中,我們可以說,其中的變量host就是一個InetAddress;InetAddress.getLocalHost()返回一個InetAddress。例如,某個主機域名為“sample”,其IP地址為“128.118.2.10”,那麼,InetAddress.getLocalHost()調用返回後,變量host的值就成了“sample/128.118.2.10”。如果只對其中的主機域名感興趣,則可以調用getHostname()。

簡單地說,IP地址是4個數字。為了得到數字形式的IP地址,我們可以將上面程序稍作改動。

/*
* Program:sample2.java
*/
import java.net.*;
public class GetAddress {
public static void main (String argv〔〕) throws Exception {
InetAddress host=null;
host=InetAddress.getLocalHost();
byte ip〔〕=host.getAddress();
for (int i=0;i<ip.length;i++) {
if (i>0 System.out.print(".");
System.out.print(ip〔i〕& 0xff);
}
System.out.println();
}}

getAddress()返回一個長度為4的字節數組。例如,如果IP地址為“128.118.2.10”,則上面程序中的變量ip的最後內容為:

ip〔0〕=128ip〔1〕=118ip〔2〕=2ip〔3〕=10

Internet上的所有計算機都擁有一個唯一的IP地址和主機名。既然如此,我們要這些地址有什麼用呢?這些地址可以幫助我們定位Internet上的固定資源,也可以使路由工作順利地進行。

熟知UNIX的人都知道,UNIX系統中有一個復雜的DNS客戶程序??nslookup工具。利用nslookup,我們可以根據已知的IP地址,找到相應的主機名;也可以根據主機名,找到相應的IP地址。它可算是一個非常有用的工具。下面的示例程序則可以讓我們找到Internet上所有可以訪問主機的IP地址。

/*
* Program:nslookup.java
*/
import java.net.*/;
public class nslookup {
//Usage:java nslookup hostname
public static void main (String argv〔〕) throws Exception {
String host=argv〔0〕;
InetAddress address=null;
try {
address=InetAddress.getByName(host);
} catch(UnknownHostException e) {
System.out.println("Unknown host");
System.exit(0);
}
byte〔〕 ip〔〕=address.getAddress();
for (int i=0;i<ip.length;i++) {
if (i>0 System.out.print(".");
System.out.print(ip〔i〕& Oxff);
}
System.out.println();
}}

在JDK 1.0.2(Java Develop Kit-Java開發工具包中,編制一個程序,將主機名轉換為IP地址並不太容易。這是由於InetAddress類中getHostName方法中有一個bug。這個bug在JDK 1.1 beta版中得以修正,所以下列代碼在JDK 1.1中應該可以運行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved