<%@ page contentType="text/html; charset=gb2312"%> 使用Java来实现域名和IP地址转换的操作
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
使用Java来实现域名和IP地址转换的操作
     发布者: 发布时间:2007-07-10
 

对我们普通用户而言,形象化的符号要比一捆枯燥的数字编码要好记得多。比如,我们会很容易地记住字符串“www.chinahtml.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

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技术网(www.java114.com))
 
更多精彩文章:
常见Java开源JMS消息中间件及特性简介
表现层框架之争 JSF与Struts框架的异同
Web应用下实现定时任务的简便方法
JSP结合XML+XSLT将输出转换HTML
简述构建高性能J2EE应用的五种核心策略
用XML+JSP实现网页内容动态显示的方案
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(2529)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(2651)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(7677)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(1058)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(7451)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号