`
seara
  • 浏览: 624229 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法

阅读更多

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Java网络编程从入门到精通(1):Internet地址概述

InetAddress类是Java中用于描述IP地址的类。它在java.net包中。在Java中分别用Inet4AddressInet6Address类来描述IPv4IPv6的地址。这两个类都是InetAddress的子类。由于InetAddress没有public的构造方法,因此,要想创建InetAddress对象,必须得依靠它的四个静态方法。InetAddress可以通过getLocalHost方法得到本机的InetAddress对象,也可以通过getByNamegetAllByNamegetByAddress得到远程主机的InetAddress对象。

一、getLocalHost方法

使用getLocalHost可以得到描述本机IPInetAddress对象。这个方法的定义如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicstaticInetAddressgetLocalHost()throwsUnknownHostException

这个方法抛出了一个UnknownHostException异常,因此,必须在调用这个方法的程序中捕捉或抛出这个异常。下面的代码演示了如何使用getLocalHost来得到本机的IP和计算机名。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package inet;

importjava.net.*;

publicclassMyInetAddress1
{
publicstaticvoidmain(String[]args)throwsException
{
InetAddresslocalAddress
=InetAddress.getLocalHost();
System.out.println(localAddress);
}
}

运行结果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->ComputerName/192.168.18.10

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

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicStringtoString()
{
return((hostName!=null)?hostName:"")+"/"+getHostAddress();
}

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

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

二、getByName方法

这个方法是InetAddress类最常用的方法。它可以通过指定域名从DNS中得到相应的IP地址。getByName一个String类型参数,可以通过这个参数指定远程主机的域名,它的定义如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicstaticInetAddressgetByName(Stringhost)throwsUnknownHostException

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

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package inet;

importjava.net.*;

publicclass MyInetAddress2
{
publicstaticvoidmain(String[]args)throwsException
{
if(args.length==0)
return;
Stringhost
=args[0];
InetAddressaddress
=InetAddress.getByName(host);
System.out.println(address);
}
}

  • 测试1:远程主机www.csdn.net

执行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->java inet.MyInetAddress2www.csdn.net

运行结果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->www.csdn.net/211.100.26.124
  • 测试2:本机名ComputerName

执行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->javainet.MyInetAddress2 ComputerName

运行结果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->ComputerName/192.168.18.10
  • 测试3:代表本机的localhost

执行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->java inet.MyInetAddress2 localhost

运行结果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->localhost/127.0.0.1

对于本机来说,除了可以使用本机名或localhost外,还可以在hosts文件中对本机做“IP/域名映射(在Windows操作系统下)。这个文件在C:\WINDOWS\system32\drivers\etc中。打开这两个文件中,在最后加一行如下所示的字符串:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->192.168.18.100 www.mysite.com

  • 测试4:本机域名www.mysite.com

执行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->java inet.MyInetAddress2 www.mysite.com

运行结果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->www.mysite.com/192.168.18.100

getByName方法除了可以使用域名作为参数外,也可以直接使用IP地址作为参数。如果使用IP地址作为参数,输出InetAddress对象时域名为空(除非调用getHostName方法后,再输出InetAddress对象。getHostName方法将在下面的内容介绍)。读者可以使用129.42.58.212作为MyInetAddress2的命令行参数(这是www.ibm.comIP),看看会得到什么结果。

三、getAllByName方法

使用getAllByName方法可以从DNS上得到域名对应的所有的IP。这个方法返回一个InetAddress类型的数组。这个方法的定义如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicstaticInetAddress[]getAllByName(Stringhost)throwsUnknownHostException

getByName方法一样,当host不存在时,getAllByName也会抛出UnknowHostException异常,getAllByName也不会验证IP地址是否存在。下面的代码演示了getAllByName的用法:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package inet;

importjava.net.*;

publicclass MyInetAddress3
{
publicstaticvoidmain(String[]args)throwsException
{
if(args.length==0)
return;
Stringhost
=args[0];
InetAddressaddresses[]
=InetAddress.getAllByName(host);
for(InetAddressaddress:addresses)
System.out.println(address);
}
}

  • 测试1:远程主机www.csdn.net

执行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->java inet.MyInetAddress3 www.csdn.net

运行结果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->www.csdn.net/211.100.26.124
www.csdn.net
/211.100.26.121
www.csdn.net
/211.100.26.122
www.csdn.net
/211.100.26.123

将上面的运行结果和例程3-2的测试1的运行结果进行比较,可以得出一个结论,getByName方法返回的IP地址就是getAllByName方法返回的第一个IP地址。事实上,getByName的确是这样实现的,getByName的实现代码如下:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicstaticInetAddressgetByName(Stringhost)throwsUnknownHostException
{
returnInetAddress.getAllByName(host)[0];
}
  • 测试2:使用www.csdn.net的一个IP

执行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->java inet.MyInetAddress3 211.100.26.122

运行结果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->/211.100.26.122

四、getByAddress方法

这个方法必须通过IP地址来创建InetAddress对象,而且IP地址必须是byte数组形式。getByAddress方法有两个重载形式,定义如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicstaticInetAddressgetByAddress(byte[]addr)throwsUnknownHostException
publicstaticInetAddressgetByAddress(Stringhost,byte[]addr)throwsUnknownHostException

第一个重载形式只需要传递byte数组形式的IP地址,getByAddress方法并不验证这个IP地址是否存在,只是简单地创建一个InetAddress对象。addr数组的长度必须是4IPv4)或16IPv6),如果是其他长度的byte数组,getByAddress将抛出一个UnknownHostException异常。第二个重载形式多了一个host,这个hostgetByNamegetAllByName方法中的host的意义不同,getByAddress方法并不使用hostDNS上查找IP地址,这个host只是一个用于表示addr的别名。下面的代码演示了getByAddress的两个重载形式的用法:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package inet;

importjava.net.*;

publicclass MyInetAddress4
{
publicstaticvoidmain(String[]args)throwsException
{
byteip[]=newbyte[] {(byte)141,(byte)146,8,66};
InetAddressaddress1
=InetAddress.getByAddress(ip);
InetAddressaddress2
=InetAddress.getByAddress("Oracle官方网站",ip);
System.out.println(address1);
System.out.println(address2);
}
}

上面代码的运行结果如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->/141.146.8.66
Oracle官方网站
/141.146.8.66

从上面的运行结果可以看出,getByAddress只是简单地将host参数作为域名放到“/”前面,因此,host可以是任何字符串。

下一篇:
Java网络编程从入门到精通(3):为什么不能直接通过IP访问网站



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    第13章-Java网络编程-Java面向对象程序设计教程-微课视频版-程杰-清华大学出版社.pptx

    第13章 Java网络编程 第13章-Java网络编程-Java面向对象程序设计教程-微课视频版-程杰-清华大学出版社全文共17页,当前为第2页。 13.1 TCP/IP协议简介 13.2 网络开发中的常用工具类 13.3 面向连接的TCP通信 13.4 无...

    Java网络编程基础-InetAddress类与URL类

    Java网络编程基础-InetAddress类与URL类

    JAVA网络编程

    Java网络编程基础 Datagram类使用方法 (1) .doc Java网络编程基础 InetAddress类的使用.doc Java网络编程基础 ServerSocket类使用.doc 《JAVA编程规范》.doc Java基础 三步学会Java Socket编程(一) .doc Java基础 ...

    网络编程 InetAddress 的使用

    网络编程 InetAddress 的使用

    深入Java Servlet网络编程

    5. 2 Java网络编程中的高层类 5. 2. 1 URL类 5. 2. 2 URLConnection类 第6章 利用Servlet上传和下载文件 6. 1 得到HTTP请求消息的内容 6. 2 利用Servlet得到上传的文件 6. 2. 1 上传文件及表单域的请求实体的...

    [Java] Java 网络编程 第4版 (英文版)

    [奥莱理] Java 网络编程 第4版 (英文版) [奥莱理] Java Network Programming 4th Edition (E-Book) ☆ 图书概要:☆ This practical guide provides a complete introduction to developing network programs ...

    Java网络编程的研究

    针对不同层次的网络通信,Java提供的网络功能有4大类:URL、InetAddress、Socket、Datagram。以基于Socket的Java网络编程为例,来探讨Java网络编程,具有一定的参考价值。

    42道Java网络编程相关面试题含答案(很全)

    Java网络编程主要涉及以下几个方面的内容: 网络基础知识:了解网络通信的基本原理,包括IP地址、端口号、协议等。 Socket编程:Socket是Java中实现网络通信的基础类。通过Socket类,可以实现基于TCP和UDP协议的网络...

    Java网络编程(第三版)中文版.part09.rar

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

    Java高级程序设计:第14章-基于Socket的网络编程.pptx

    Java网络编程;Java网络基本类 ---InetAddress类;import .*; public class IPAddressDemo { public static void main(String[] args) { try { InetAddress localAddr = InetAddress.getLocalHost();//获得本机...

    Java编程中利用InetAddress类确定特殊IP地址的方法

    主要介绍了Java编程中利用InetAddress类确定特殊IP地址的方法,InetAddress类是Java网络编程中一个相当实用的类,需要的朋友可以参考下

    Java网络编程(第三版)中文版.part11.rar

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

    java pptJava 中的网络编程

    java课程ppt,第11章 Java 中的网络编程, 1. URL类 2. 读取URL中的资源 3. 显示URL资源中的HTML文件 4. 处理超链接 5. InetAddress类 6. 套接字Socket 7. 使用多线程处理套接字连接 8. UDP数据报 9. 广播数据包

    Java网络编程(第三版)中文版.part06.rar

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

    Java网络编程(第三版)中文版.part07.rar

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

    Android开发之InetAddress基础入门简介与源码实例

    最近在学习soket编程中,看到有需要获取到IP地址之类的需求,所以就去看了下如何获取到主机名的IP地址。 其实就是需要用到一个类InetAddress。他是在java.net包下面。 InetAddress类的对象用于IP地址和域名,该类...

    Java网络编程(第三版)中文版.part01.rar

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

    Java网络编程(第三版)中文版.part03.rar

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

    Java网络编程(第三版)中文版.part02.rar

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

    Java网络编程(第三版)中文版.part04.rar

    本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播以及特殊用途的API(如JavaMail)等等。本书展示了如何使用JSSE编写安全的...

Global site tag (gtag.js) - Google Analytics