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);
}
}
}