本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇:Java网络编程从入门到精通(1):Internet地址概述
InetAddress类是Java中用于描述IP地址的类。它在java.net包中。在Java中分别用Inet4Address和Inet6Address类来描述IPv4和IPv6的地址。这两个类都是InetAddress的子类。由于InetAddress没有public的构造方法,因此,要想创建InetAddress对象,必须得依靠它的四个静态方法。InetAddress可以通过getLocalHost方法得到本机的InetAddress对象,也可以通过getByName、getAllByName和getByAddress得到远程主机的InetAddress对象。
一、getLocalHost方法
使用getLocalHost可以得到描述本机IP的InetAddress对象。这个方法的定义如下:
<!--<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所指的域名对应多个IP,getByName返回第一个IP。如果本机名已知,可以使用getByName方法来代替getLocalHost。当host的值是localhost时,返回的IP一般是127.0.0.1。如果host是不存在的域名,getByName将抛出UnknownHostException异常,如果host是IP地址,无论这个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);
}
}
执行如下命令:
<!--<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
执行如下命令:
<!--<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
执行如下命令:
<!--<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
执行如下命令:
<!--<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.com的IP),看看会得到什么结果。
三、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);
}
}
执行如下命令:
<!--<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];
}
执行如下命令:
<!--<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数组的长度必须是4(IPv4)或16(IPv6),如果是其他长度的byte数组,getByAddress将抛出一个UnknownHostException异常。第二个重载形式多了一个host,这个host和getByName、getAllByName方法中的host的意义不同,getByAddress方法并不使用host在DNS上查找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开发速学宝典》出版,欢迎定购
分享到:
相关推荐
### JAVA网络编程从入门到精通知识点详解 #### 一、Internet地址概述 互联网中的每一台设备都需要有一个唯一的标识符——IP地址。当前广泛使用的IPv4地址由四个字节组成,而未来的趋势是采用16个字节的IPv6地址。 ...
Java网络编程是开发分布式应用程序的关键技术,它涵盖了网络通信的基础概念和高级应用。...通过编写网络通信的示例程序,可以更好地理解和掌握网络编程的概念和技术,从而达到从入门到精通的目标。
Java网络编程是开发基于互联网应用的关键技术之一,而理解Internet地址是网络编程的基础。本文将深入探讨IP地址的原理和应用,尤其是IPv4和IPv6这两种主要的IP地址类型。 首先,IP地址是互联网上每个设备独一无二的...
- **网络模型**:Java网络编程基于OSI七层模型和TCP/IP四层模型。理解这些模型有助于理解网络通信的基本原理。 - **IP地址与端口号**:IP地址用于标识网络上的设备,端口号则区分同一设备上的不同服务。 2. **...
本实验主要涉及Java 网络编程的基础知识,包括使用InetAddress类获取主机的IP地址和主机名称,使用Socket和ServerSocket类实现C/S通信。 一、 InetAddress类 InetAddress类是Java中用于表示Internet协议(IP)地址...
Java网络编程是计算机科学中的一个重要领域,特别是在软件开发中,它涉及到如何通过网络进行数据传输和通信。在Java中,网络编程主要依赖于Java的Socket编程、ServerSocket、URL类以及NIO(非阻塞I/O)等核心API。这...
Java网络编程是开发分布式应用程序的关键部分,InetAddress和URL类在其中扮演了核心角色。这两个类都是Java.net包中的核心组件,它们提供了处理网络地址和定位网络资源的能力。 首先,让我们深入了解InetAddress类...
2. **I/O与NIO**:Java的I/O流系统是网络编程的基础,包括字节流、字符流、对象流等。此外,非阻塞I/O(NIO)的引入为高性能网络应用提供了可能,如Selector和Channel的概念。 3. **多线程与并发**:在网络编程中,...
1. **创建InetAddress对象**:可以通过四个静态方法创建`InetAddress`对象,包括通过主机名、IP地址或者同时指定主机名和IP地址。 2. **域名与IP转换**:`getHostName()`和`getCanonicalHostName()`用于获取主机名,...
- **网络I/O**:Java的InputStream和OutputStream类族在处理网络数据传输时起到关键作用,如SocketInputStream和SocketOutputStream。 - **缓冲和对象序列化**:BufferedInputStream和BufferedOutputStream用于...
- **Socket编程**:Java的Socket类代表网络上两个进程间的通信链路,它封装了TCP/IP协议,提供了数据的双向传输。 - **ServerSocket编程**:ServerSocket类用于监听特定端口的连接请求,当有新的连接请求时,会...
Java网络编程是指使用Java语言开发的网络应用程序, Java提供了四种网络功能:URL、InetAddress、Socket、Datagram。基于Socket的Java网络编程是指使用Socket类实现网络通信的编程方式。 Java网络编程的研究可以...
在Java编程中,网络编程是一个重要的领域,主要涉及到如何通过网络连接进行数据传输。这里我们关注的是TCP Socket通信,这是一种面向连接的、可靠的、基于字节流的传输层通信协议。 1. **InetAddress类**: `...
而IP协议则涉及到IP地址和端口号的概念,Java的`InetAddress`类用于处理IP地址,`InetSocketAddress`类则结合了IP地址和端口号,常用于网络编程。 其次,多线程是网络编程中的关键,因为通常服务器需要同时处理多个...
### 知识点:网络编程中的InetAddress类使用方法 在网络编程中,`InetAddress` 类是Java标准库中用于处理互联网地址的核心类之一。它主要用于封装和操作IP地址,并提供了一系列方法来获取和处理IP地址相关的数据。...
由于InetAddress只有一个私有的构造函数,因此不能直接实例化,而是通过一系列的静态工厂方法创建InetAddress对象。 1. `getAllByName(String host)`:此方法根据提供的主机名返回一个InetAddress对象数组,每个...
学习过程中,通过阅读《Java网络编程学习资料》这本书,你可以了解到如何创建简单的服务器和客户端示例,理解Socket通信的过程,以及如何利用JTA进行分布式事务管理。书中可能还包含了一些实用的代码示例和最佳实践...
### Java网络编程:连接网络数据库的多种方法 #### 摘要 随着互联网技术的不断发展,Java作为一种跨平台、安全且适用于分布式计算环境的语言,在网络应用程序开发中扮演着至关重要的角色。尤其在网络数据库连接方面...
"Javanetwlbc"可能是一个具体的网络编程案例或代码练习,名称可能是“Java网络编程练习”或类似的意思。这可能包含了如何创建服务器、接收客户端连接、交换数据等方面的代码实现。 总的来说,"Java网络编程.chm"这...
Java网络编程是Java开发中不可或缺的一部分,它涵盖了网络通信的各种层面,从应用层到物理层。在Java中,网络编程主要涉及三个核心概念:网络协议、URL编程和Socket编程。 首先,网络协议是网络通信的基础,它定义...