1、概述
Java中是面向对象的编程,所谓“万物即是对象”,即使是简单的字符串,封装成String对象后,也提供了丰富而强大函数,方便我们便捷的开发程序。
如果你还未了解Java的编程特点,可能觉的IP地址表示为四段字节码的文本形式就足够了,但是你在学习网络编程的过程中,发现所有函数传入或者返回IP时,都不提供字符串形式,所以有必要了解IP地址在Java API中提供的类及相关方法。
2、IP类及对象
Java API提供IP对应类为:InetAddress。
包路径:java.net.InetAddress。
1、static InetAddress getByName(String host)
host可以为IP地址的字符串形式,如本机地址“127.0.0.1”或者是“192.168.1.1”等;还可以是主机名(也可以称为域名),如本机主机名“localhost”和“www.google.com”。如果提供字面值 IP 地址,则仅检查地址格式的有效性,不检查该IP地址在网络上是否存在。
主机名是为了解决IP地址难以记忆的缺点,所以使用更加人性化的文字标识,比如google的服务器IP地址220.255.2.153,相对于域名“www.google.com”来说不容易记住。
但是所有通过域名的网络请求,最终会通过本地DNS和公共DNS服务器,把域名解析为IP地址,网际层只封装IP地址。
2、static InetAddress getLocalHost()
该方法会返回本机的IP地址对象,与getByName("127.0.01")和getByName("localhost")是同样的效果。
3、常用方法。
String getHostAddress():返回IP地址文本表现形式。
String getHostName():返回IP地址对应的主机名,会在本地Hosts文件下去搜索是否有对应的主机名,如果没有,则显示IP地址文本形式,有,则显示主机名。
4、简单的示例
package com.example.network;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IPDemo {
public static void main(String[] args) throws UnknownHostException {
getLocalIP();
getIPByName("www.google.com");//检查本地hosts文件和DNS服务器上的对应IP,没有,则报错,参照最后一条。
getIPByName("220.255.2.153");//检查本地hosts文件和DNS服务器上的对应域名,没有,则返回字符串形式。
getIPByName("1.1.1.1");//不会报错,只检查地址格式的有效性
getIPByName("www.google11.com");//报错,DNS无法解析该域名。
}
private static void getLocalIP() throws UnknownHostException {
//1、返回本机IP对象,当查找不到本机IP地址,会抛出UnknownHostException异常
InetAddress ip = InetAddress.getLocalHost();
//2、查看IP地址字符串形式
String ip_str = ip.getHostAddress();
System.out.println(ip_str);
//3.查看IP地址对应的主机名,优先检查计算机属性中计算机名,然后是本地hosts文件中,最后是公共DNS服务器。
String hostName = ip.getHostName();
System.out.println(hostName);
}
private static void getIPByName(String host) throws UnknownHostException {
/*
* 1、主机名可以是机器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式。如果提供字面值 IP 地址,则仅检查地址格式的有效性。
* 如果是主机名,查找不到该主机名,则抛出异常UnknownHostException。
*/
InetAddress ip = InetAddress.getByName(host);
//2、查看IP地址字符串形式,如果第一步骤中传入主机名,则该方法会检查本地hosts文件及公共DNS服务器,以便返回对应的IP地址;否则,返回IP地址的字符串表现形式。
String ip_str = ip.getHostAddress();
System.out.println(ip_str);
//3.查看IP地址对应的主机名,如果第一步骤中传入IP地址,则该方法会检查本地hosts文件及公共DNS服务器,如果没有则返回IP地址的字符串表现形式;否则,返回主机名。
String hostName = ip.getHostName();
System.out.println(hostName);
}
}
输出:
192.168.1.102
PC201507260924
220.255.2.153
www.google.com
220.255.2.153
chatenabled.mail.google.com
1.1.1.1
1.1.1.1
Exception in thread "main" java.net.UnknownHostException: www.google11.com
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:849)
at java.net.InetAddress.getAddressFromNameService(InetAddress.java:1200)
at java.net.InetAddress.getAllByName0(InetAddress.java:1153)
at java.net.InetAddress.getAllByName(InetAddress.java:1083)
at java.net.InetAddress.getAllByName(InetAddress.java:1019)
at java.net.InetAddress.getByName(InetAddress.java:969)
at com.example.network.IPDemo.getIPByName(IPDemo.java:40)
at com.example.network.IPDemo.main(IPDemo.java:19)