一个客户端想要发起一次通信,先决条件就是需要知道运行着服务器端程序的主机的IP地址是多少。然后我们才能够通过这个地址向服务器发送信息。
获取主机地址信息
在Java中我们使用InetAddress类来代表目标网络地址,包括主机名和数字类型的地址信息,并且InetAddress的实例是不可变的,每个实例始终指向一个地址。InetAddress类包含两个子类,分别对应两个IP地址的版本:
- Inet4Address
- Inet6Address
我们通过前面的笔记可以知道:IP地址实际上是分配给主机与网络之间的连接,而不是主机本身,NetworkInterface类提供了访问主机所有接口的信息的功能。下面我们通过一个简单的示例程序来学习如何获取网络主机的地址信息:
- import java.net.*;
- import java.util.Enumeration;
- public class InetAddressExample {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- // 获取主机网络接口列表
- Enumeration<NetworkInterface> interfaceList = NetworkInterface
- .getNetworkInterfaces();
- // 检测接口列表是否为空,即使主机没有任何其他网络连接,回环接口(loopback)也应该是存在的
- if (interfaceList == null) {
- System.out.println("--没有发现接口--");
- } else {
- while (interfaceList.hasMoreElements()) {
- // 获取并打印每个接口的地址
- NetworkInterface iface = interfaceList.nextElement();
- // 打印接口名称
- System.out.println("Interface" + iface.getName() + ";");
- // 获取与接口相关联的地址
- Enumeration<InetAddress> addressList = iface
- .getInetAddresses();
- // 是否为空
- if (!addressList.hasMoreElements()) {
- System.out.println("\t(没有这个接口相关的地址)");
- }
- // 列表的迭代,打印出每个地址
- while (addressList.hasMoreElements()) {
- InetAddress address = addressList.nextElement();
- System.out
- .print("\tAddress"
- + ((address instanceof Inet4Address ? "(v4)"
- : address instanceof Inet6Address ? "v6"
- : "(?)")));
- System.out.println(":" + address.getHostAddress());
- }
- }
- }
- } catch (SocketException se) {
- System.out.println("获取网络接口错误:" + se.getMessage());
- }
- // 获取从命令行输入的每个参数所对应的主机名和地址,迭代列表并打印
- for (String host : args) {
- try {
- System.out.println(host + ":");
- InetAddress[] addressList = InetAddress.getAllByName(host);
- for (InetAddress address : addressList) {
- System.out.println("\t" + address.getHostName() + "/"
- + address.getHostAddress());
- }
- } catch (UnknownHostException e) {
- System.out.println("\t无法找到地址:" + host);
- }
- }
- }
- }
查看运行效果:
总结:
在Java Socket编程中获取主机地址信息最关键的两个类是:InetAddress和NetworkInterface,在Socket编程时必须了解这两个类的常用API和并且熟练的使用它们。