快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

利用JAVA完成域名和IP地址的转变

对我们普通用户而言,形象化的符号要比一捆枯燥的数字编码要好记得多。比如,我们会很轻易地记住字符串“www.oscar.com”,却很难记住206.17.191.12。本文简要地介绍了Internet命名规则和地址的划分约定,然后介绍了如何利用Java语言完成符号名(上面的字符串)和IP地址(上面的数字串)之间的转变工作,并给出一个实例,检查可访问的远程主机。
?
Internet命名规则和地址划分约定

在Internet上,符号名(symbolic Name)用来命名主机和网络,例如www.oscar.com。这些符号名的“学名”叫做“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?

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中应该可以运行。
返回类别: 教程
上一教程: 我学习使用JAVA的一点体会
下一教程: JSP数据库数据分页显示

您可以阅读与"利用JAVA完成域名和IP地址的转变"相关的教程:
· java中实现IP地址的各种表现形式之间的转变
· [j2se]利用JAVA获得IP地址的法子
· 根据IP找地址的java实现
· java程序得到域名对应的所有IP地址
· 编写一个JAVA小程序取得IP地址
    微笑服务 优质保证 索取样品