java.net.InetAddress类是Java对IP地址(包括IPv4和IPv6)的高层表示。
InetAddress没有公共构造函数。有一些静态工厂方法,可以连接到DNS服务器来解析主机名。InetAddress.getByName()。
InetAddress address = InetAddress.getByName("www.oreilly.com");
InetAddress address = InetAddress.getByName("208.201.239.100");
getAllByName()得到一个主机的所有地址。
getLocalHost()方法会为运行这个代码的主机返回一个InetAddress对象。
getByAddress(byte[] addr)
getByAddress(String hostname,byte[] addr)
InetAddress类会缓存查找的结果。
得到给定主机的地址,就不会再次查找。
优先使用主机名查找,只有当主机名不可用时才使用IP地址
要测试一个主机能否解析,所用的特定SecurityManager方法是checkConnect():
public void checkConnect(String hostname,int port)
当port参数为-1时,检查能否调用DNS解析指定的hostname。
当port参数大于-1,检查是否允许在指定端口对指定主机建立连接。
将主机名作为字符串返回,将IP地址返回为字符串和字节数组
public String getHostName()
public String getCanonicalHostName()
public byte[] getAddress()
public String getHostAddress()
Java提供了10个方法来测试InetAddress对象是否符合其中某个标准。
isAnyLocalAddress()判断是否是通配地址。通配地址可以匹配本地系统中的任何地址。IPv4中,通配地址是0.0.0.0;IPv6中通配地址是0:0:0:0:0:0:0:1
isLoopbackAddress()判断是否是回送地址。回送地址直接在IP层连接同一台计算机,而不使用任何物理硬件。在IPv4中,回送地址是172.0.0.1;在IPv6中,回送地址是0:0:0:0:0:0:0:1。
isLinkLocalAddress()判断是否是IPv6本地链接地址。IPv6本地链接地址可以用于帮助IPv6网络实现自配置。所有本地链接地址都以8字节FE80:0000.0000:0000开头。
isSiteLocalAddress()判断是否是一个IPv6本地网络地址。本地网络地址以8字节FEC0:0000.0000:0000开头。
isMulticastAddress()判断是否是一个组播地址。组播地址会将内容广播给所有预定的计算机,而不是某一台计算机。
isMCGlobla()
isMCOrgLocal()
isMCSiteLocal()
isMCLinkLocal()
isMCNodeLocal()
InetAddress类有两个isReachable()方法,可以测试一个特定节点对当前主机是否可达。
public boolean isReachable(int timeout) throws IOException
public boolean isReachable(NetworkInterface interface,int ttl,int timeout) throws IOException
Inet4Address和Inet6Address
来区分IPv4地址和IPv6地址
NetworkInterface类
NetworkInterface类表示一个本地IP地址。
由于NetworkInterface对象表示物理硬件和虚拟地址,用一些静态工厂方法可以返回与某个网络接口关联的NetworkInterface对象。可以通过IP地址、名字或枚举来请求一个NetworkInterface.
public static NetworkInterface getByName(String name) throws SocketException
... getByInetAddress(InetAddress address)...
... getNetworkInterfaces() ... 返回本地主机上的所有网络接口
有了NetworkInterface对象,就可以查询其IP地址和名字。
public Enumeration getInetAddresses()
public String getName()
public String getDisplayName()