Java使用InetAddress类获取主机名和IP地址

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012561176/article/details/48183181

1.在Java中,地址可以由一个字符串来定义,这个字符串可以是数字型的地址(其中IPv4的地址型式为:192.168.72.1,其中IPv6的地址型式为:fe20:12a0::0abc:1234),也可以是主机名(如hh.gg.com)。主机名必须被解析成数字型地址才能用来进行通信。


2.InetAddress类代表了一个网络目标地址,包括主机名和数字类型的地址信息。该类有两个子类,Inet4Address和Inet6Address,分别对应了目前IP地址的两个版本。InetAddress
实例是不可变的,一旦创建,每个实例就始终指向同一个地址。

(1).学习一个类的方法可以查看API文档,InetAddress类位于java.net包下。

(2).下面我们来介绍一个如何实例化一个InetAddress类,因为此类无构造方法,所以实例化此类有以下几种静态方法:

— staticInetAddress getLocalHost() 方法,此方法返回一个InetAddress对象,用来返回本地主机,java代码如下:

InetAddress inetAddress=InetAddress.getLocalHost();

— static InetAddress getByName(String host) 方法,此方法返回一个InetAddress对象,用来在给定主机名的情况下确定主机的 IP 地址,java代码如下:

InetAddress inetAddress=InetAddress.getByName("Lc");

— static InetAddress getByAddress(byte[] addr) 方法,用来在给定原始IP地址得情况下,返回一个InetAddress对象,java代码如下:

InetAddress inetAddress=InetAddress.getByAddress(b);

其中的b为一个字节数组 ,参数按网络字节顺序:地址的高位字节位于 getAddress()[0] 中,IPv4 地址 byte 数组的长度必须为 4 个字节,IPv6 byte 数组的长度必须为 16 个字节。

— static InetAddress getByAddress(String host,byte[] addr) 方法, 根据提供的主机名和 IP 地址创建 InetAddress,java代码如下:

InetAddress inetAddress=InetAddress.getByAddress("Lc", b);

其中的b为一个字节数组,具体意思与上面的b一致。

(3).其中有另外此类有一个特殊的静态特殊方法:

static InetAddress[ ] getAllByName() 方法,在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组,java代码如下:

InetAddress[] inetAddress=InetAddress.getAllByName("Lc");

(4).接下来附上此类的一些主要方法:

— toString() 方法,将此 IP 地址转换为 String

— byte[ ] getAddress() 方法,返回此 InetAddress 对象的原始 IP 地址。如果将此字节数组输出在控制台下,会出现一个存放此字节数组的内存地址。

— String getCanonicalName() 方法, 获取此 IP 地址的完全限定域名。

— String getHostAddress() 方法,返回 IP 地址字符串(以文本表现形式)。

— String getHostName() 方法,获取此 IP 地址的主机名。

— boolean isReachable(int timeout) 方法,测试是否可以达到该地址。

其他方法请自行查看API文档。


3.接下来附上一个例子,用来获取主机名及IP地址:

(1).新建一个包,为com.inetaddress包,在此包下新建一个Address类,代码如下:

package com.inetaddress;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class Address {
	public static void main(String[] args) throws IOException{
		InetAddress inetAddress;//声明InetAddress对象
		try {
			inetAddress=InetAddress.getLocalHost();//实例化InetAddress对象,返回本地主机
			String hostName=inetAddress.getHostName();//获取本地主机名
			String canonicalHostName=inetAddress.getCanonicalHostName();//获取此 IP地址的完全限定域名
			byte[] address=inetAddress.getAddress();//获取原始IP地址
			int a=0;
			if(address[3]<0){
				a=address[3]+256;
			}
			String hostAddress=inetAddress.getHostAddress();//获取本地主机的IP地址
			boolean reachable=inetAddress.isReachable(2000);//获取布尔类型,看是否能到达此IP地址
			System.out.println(inetAddress.toString());
			System.out.println("主机名为:"+hostName);//输出本地主机名
			System.out.println("此IP地址的完全限定域名:"+canonicalHostName);//输出此IP地址的完全限定域名
			System.out.println("原始IP地址为:"+address[0]+"."+address[1]+"."+address[2]+"."+a);//输出本地主机的原始IP地址
			System.out.println("IP地址为:"+hostAddress);//输出本地主机的IP地址
			System.out.println("是否能到达此IP地址:"+reachable);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

上面的代码存在一点问题,就是获取原始IP地址时,返回的是一个字节数组,如果把这个字节输出到控制台下的话,会显示此字节数组在内存中的存放地址,所以我在输出时用了address[0]等数组的形式输出字节,其中如果字节数组中的某个字节大于128的话,将会导致输出来的数字是负数,应此我把我的IP地址中超过128的加上256,便没问题了,我的代码仅做测试,正常来说,要把字节数组转换为整型数据类型,再取出来。

(2)运行此类,控制台输出如下:

这里我把IP地址给涂鸦了,请见谅!大家可以自己在机子上实验一下!


其中我还写了其他的测试代码,下载地址:http://download.csdn.net/download/u012561176/9074737 

4.以上内容仅供大家学习参考,写得不好,请见谅,如有错误,请指出,谢谢!



展开阅读全文

没有更多推荐了,返回首页