Java网络编程之InetAddress类

InetAddress类是JAVA中用于描述IP地址的类,它在java.net包中。在JAVA中分别用Inet4Address和Inet6Address类来描述IPv4和IPv6的地址。这两类都是InetAddress的子类。由于InetAddress没有public的构造方法,因此,要想创建InetAddress对象,必须依靠它的四个静态方法。

getLocalHost方法

用来得到描述本机IP的InetAddress对象。当查找不到本机主机的地址时,触发异常。代码如下

package MyInetAddress;

import java.net.InetAddress;

import java.net.UnknownHostException;

public class MyInetAddress {

public static void main(String[] args) throws Exception

{

try{

InetAddress localAddress = InetAddress.getLocalHost();

System.out.println(localAddress);

}

catch (UnknownHostException el){

el.printStackTrace();

}

}

}

结果显示:

此程序运行结果不同主机的主机名和IP地址是不同的

在InetAddress类中覆盖了Object类中的toString方法,实现如下

public String toString() {

String hostName = holder().getHostName();

return ((hostName != null) ? hostName : "")

+ "/" + getHostAddress();

}

InetAddress方法中的toString方法返回了用“/”隔开的主机名和IP地址。因此上面可以直接通过localAddress对象来输出本机名和IP地址,在将对象参数传入println方法后,println方法会调用对象参数的toString方法来输出结果。

本机绑定多个IP时,getLocalHost只返回第一个IP。如果像返回本机全部的IP,可以使用getAllByName方法。

getByName方法

getByName方法是InetAddress类最常用的方法。它可以通过指定域名从DNS中得到相应的IP地址。

如果host所指的域名对应多个IP,getByName返回第一个IP。如果本机名已知可以使用getByName方法来代替getLocalHost。当host的值是localhost时,返回值一般是127.0.0.1,若host是不存在的域名,getByName将抛出异常,如果host是IP地址,无论这个IP地址是否存在,都会返回这个IP地址(因为getByName并不验证IP地址的正确性),下面写一个demo

package MygetByName;

import java.net.*;

public class MygetByName {

public static void main(String[] args) throws Exception{

if(args.length == 0)

return;

String host = args[0];

try{

InetAddress address = InetAddress.getByName(host);

System.out.println(address);

}

catch(UnknownHostException el){

el.printStackTrace();

}

}

}

注意给主函数传参,若使用控制台,则直接在正常编译命令后面加对应参数,若使用eclipse,则在run as里选中 run configuration

,选择第2个选项卡 (x)=Arguments ,在Program arguments里输入参数,点下Apply,最后再点Run ,若使用idea,则在run下的Exit Configurations中配置Configuration分页中的Program arguments选项,就可以进行传参

运行结果:

getAllByName方法

可以从DNS上得到域名对应的所有IP

package MygetAllByName;

import java.net.InetAddress;

public class MygetAllByName {

public static void main(String[] args) throws Exception{

if(args.length == 0)

return;

String host = args[0];

InetAddress addressses[] = InetAddress.getAllByName(host);

for(InetAddress address : addressses)

System.out.println(address);

}

}

结果如下

getHostAddress方法

用来得到主机的IP地址

方法定义如下

public String getHostAddress()

demo如下

package MygetHostAddress;

import java.net.*;

public class MygetHostAddresss {

public static void main(String[] args){

try{

InetAddress ad = InetAddress.getByName(args[0]);

System.out.println("IP 地址为; " + ad.getHostAddress());

}catch(UnknownHostException el){

el.printStackTrace();

}

}

}

getAddress方法

与getHostAddrsss方法唯一区别是getHostAddress方法赴安徽的是字符串形式的IP地址,getAddress反水的是Byte数组形式的IP地址。可用来判断是ipv4 or ipv6,也可用来判断是ABC哪类地址。demo如下

package MygetAddress;

import java.net.*;

public class MygetAddress {

public static void main(String[] args){

try{

InetAddress inetadd = InetAddress.getLocalHost();

byte[] address = inetadd.getAddress();

if(address.length == 4)

{

System.out.println("The IP version is ipv4");

int firstbyte = address[0];

if(firstbyte < 0)

firstbyte += 256;

System.out.println(firstbyte);

if(firstbyte <= 127)

System.out.println("A");

else if(firstbyte >=128 && firstbyte <= 191)

System.out.println("B");

else if(firstbyte >=192 && firstbyte <= 223)

System.out.println("C");

}else if(address.length == 16)

System.out.println("ipv6");

}catch (Exception e)

{};

}

}

getHostName方法

根据给定IP地址查找主机名

package MygetHostName;

import java.net.*;

public class MygetHostName {

public static void main(String[] args){

try{

InetAddress inetadd;

inetadd = InetAddress.getLocalHost();

System.out.println("HostName = " + inetadd.getHostName());

System.out.println(inetadd.toString());

}catch(Exception e){

System.out.println(e);

}

}

}