17.2 Java的基本网络支持 17.2.1 使用InetAddress

17.2 Java的基本网络支持

Java为网络支持提供了java.net包,该包下的

  • URLURLConnection等类提供了以编程方式访问Web服务的功能,
  • URLDecoderURLEncoder则提供了普通字符串和application/x-www-form-urlencoded MIME字符串相互转换的静态方法.

17.2.1 使用InetAddress

Java提供了InetAddress类来代表IP地址,InetAddress下还有两个子类:Inet4AddressInet6Adress它们分别代表Internet Protocol version 4(IPv4)地址和Internet Protocol version 6(IP6)地址。

InetAddress

获取InetAddress类对象

InetAddress类没有提供构造器,而是提供了如下两个静态方法来获取InetAddress实例

方法 描述
static InetAddress getByName(String host) 根据主机获取对应的InetAddress对象
static InetAddress getByAddress(byte[] addr) 根据原始IP地址来获取对应的InetAddress对象

除此之外,InetAddress类还提供了一个getLocalHost()方法来获取本机IP地址对应的InetAddress实例

读取InetAddress对象的IP地址和主机名

InetAddress还提供了如下三个方法来获取InetAddress实例对应的IP地址和主机名。

方法 描述
String getCanonicalHostName() 获取此IP地址的全限定域名。
String getHostAddress() 返回该InetAddress实例对应的IP地址字符串(以字符串形式)。
String getHostName() 获取此IP地址的主机名

判断IP地址是否可达

Inetaddress类还提供了一个isReachable()方法,用于测试是否可以到达该地址。该方法将尽最大努力试图到达主机,但防火墙和服务器配置可能阻塞请求,使得它在访问某些特定的端口时处于不可达状态。如果可以获得权限,典型的实现将使用ICMP ECHO REQUEST;否则它将试图在目标主机的端口7(Echo)上建立TCP连接。

程序示例

下面程序测试了InetAddress类的简单用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.net.*;

public class InetAddressTest {
public static void main(String[] args) throws Exception {
// 根据主机名来获取对应的InetAddress实例
InetAddress ip = InetAddress.getByName("lanlan2017.github.io");
// 判断是否可达
System.out.println("lanlan2017.github.io是否可达:" + ip.isReachable(2000));
// 获取该InetAddress实例的IP字符串
System.out.println(ip.getHostAddress());
// 根据原始IP地址来获取对应的InetAddress实例
InetAddress local = InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 });
System.out.println("本机是否可达:" + local.isReachable(5000));
// 获取该InetAddress实例对应的全限定域名
System.out.println(local.getCanonicalHostName());
}
}

上面程序简单地示范了Inetaddress类的几个方法的用法,InetAddress类本身并没有提供太多功能,它代表一个IP地址对象,是网络通信的基础,在后面介绍中将大量使用该类