利用Java来实现域名和IP地点转换的操纵
副标题#e#
对我们普通用户而言,形象化的标记要比一捆枯燥的数字编码要好记得多。好比,我们会很容易地记着字符串“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常量的要领就不太好用了。我们但愿应用措施可以或许自动检测获得当前主机的域名。下面的措施说明白如何完成这一事情。
#p#副标题#e#
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地点,我们可以将上面措施稍作窜改。
#p#分页标题#e#
/*
* 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中应该可以运行。