如何在Java中查询IP地址
主机是指可以连接到互联网的计算机。每台主机都有一个独特的识别号,以区别于其他在线设备。
前提条件
要继续学习,你应该具备以下条件
- 对Java和网络有基本的了解。
- 有一些使用Java.Net软件包的知识。
IP地址的定义
IP地址是一串由点分开的数字,代表互联网协议。
IP地址是四位数的数字,采用32位的格式,称为IPv4地址。例如,192.168.1.3。
也有IPv6地址,使用128位格式的六位数数字。
这组数字中的每个整数可以是0到255之间的任何地方。这意味着IP地址的范围是从0.0.0.0到255.255.255.255。
IP地址不是人们可以分配给主机的随机数字。互联网号码分配机构创建并分配IP地址给设备。
DNS的定义和它的工作流程
DNS(域名系统)是一个TCP/IP协议,它定义了不同系统中的应用进程如何交换信息。
DNS的功能类似于一个基于互联网的数据库。它有一个主机名(域)和IP地址的列表。
DNS帮助用户通过记住域名的主机名来连接所有类型的网站。因此,人们不需要随身携带一个充满IP地址的目录。
DNS将人类能够记住的主机名(如www.google.com)与计算机能够记住的IP地址(如172.217.170.164)联系起来。
DNS是如何工作的
DNS不是自成一体的;它需要额外的程序,其中之一是解析器。
resolver 是客户端软件,使其更容易连接到一个DNS服务器。
它是客户端计算机上的一个程序,协助连接到一个DNS服务器。
网络浏览器和邮件客户端是最广泛使用的解析器。因此,要访问DNS服务器,你必须在电脑上安装一个网络浏览器或邮件客户端。
Chrome、Opera、Firefox和Safari是一些最流行的浏览器。
DNS工作流程的程序
我们需要以下条件。
- 两个DNS服务器
- 一个网络浏览器
- 一台电脑
- 客户电脑向本地DNS服务器询问一个网站的IP地址。
- 本地DNS服务器将检查其记录并保留信息。
- 如果DNS服务器找到保留的文件,它将立即给浏览器应用程序一个IP地址。如果服务器找不到,它就会向在线DNS服务器发送一个请求。
- 一旦获得了IP地址,本地服务器就会把它放在一个储藏室/缓存中。当客户端计算机再次请求该IP地址时,DNS服务器不需要联系其他在线服务器。
- 如果不能在当前的服务器上得到定位,数据或缓存会被转移到不同的DNS服务器上。
使用InetAddress类在Java中表示IP地址
Java网络包作为两个或多个计算设备之间的互连点。这使它们能够共享资源并集中控制应用程序。
Java.net.InetAddress类是IPv4和IPv6的Java中IP地址的高级表示。它通常包括一个主机名和一个IP地址。
Java InetAddress类方法
InetAddress方法可以连接到本地DNS服务器以检索或发送信息。
InetAddress类缓存了DNS查询的结果,以供将来参考。
如果你的程序运行时IP地址没有变化,就不会有问题。
负面的结果,如host not found ,就会有一点问题。当信息从远程DNS服务器传输过程中,第一次连接尝试超时时,就会发生这个错误。
InetAddress.getByName() 是经常使用的方法。这个静态函数把你要找的主机名作为参数。然后,它使用DNS查找该主机的IP地址。
InetAddress address = InetAddress.getByName("www.google.com");
异常处理
如果找不到主机,InetAddress.getByName() 方法会抛出UnknownHostException 。
它可以使用throws 异常声明,或者包裹在一个try-catch 块中,如下图所示。
try{
InetAddress address = InetAddress.getByName("www.google.com");
System.out.println(address);
}
catch(UnknownHostException ex){
System.out.println("www.google.com not found");
}
常用的方法
下面是一个使用getByName() 方法的示例代码。
package com.company;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class GetIpAddress {
public static void main(String[]args) throws UnknownHostException{
InetAddress address = InetAddress.getByName("www.microsoft.com");
System.out.println("my local machine: " + address);
}
}
输出。
my local machine: www.microsoft.com/2.21.100.214
对于没有主机名的机器,你总是可以将一个包含IP地址十六进制形式的字符串传递给
InetAddress.getByName()。
例子。
InetAddress address = InetAddress.getByName("172.217.170.164");
主机名比IP地址更稳定。大多数服务都保持着相同的主机名,但它们的IP地址却在不断变化。
有些计算机会有一个以上的IP地址。这意味着InetAddress.getAllByName() ,将返回一个与该主机名对应的地址数组。
这在下面的代码片断中显示。
InetAddress[] address = InetAddress.getAllByName("www.google.com");
下面的代码显示了如何使用getAllByName() 方法返回一个地址数组。
package com. company;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class GetIpAddress {
public static void main(String[] args) throws UnknownHostException {
InetAddress[] inetAddresses=InetAddress.getAllByName("www.google.com");
for (InetAddress ipAddress : inetAddresses)
{
System.out.println("Google different ip " + ipAddress);
}
}
}
输出。
Google different ip:www.google.com/172.217.170.164
有多个IP地址的主机通常是大流量的网络服务器。
getLocalHost 方法返回主机的 InetAddress。
getLocalHost 函数在找不到主机的地址时抛出UnknownHostException 。
InetAddress address = InetAddress.getLocalHost();
下面的代码显示了如何使用getLocalHost() 方法。
package com. company;
import java.net.InetAddress;
import java.net.UnkownHostException;
public class GetIpAddress {
public static void main(String[] args)throws UnknownHostException {
InetAddress inetaddress = InetAddress.getLocalHost();
System.out.println("My local machine Ip is: "+ inetaddress);
}
}
输出。
My local machine Ip is: DESKTOP-MC2R176/192.168.43.35
当你没有连接到互联网,并且计算机缺乏固定的IP地址或域名时,默认的域名和IP地址分别为localhost ,和127.0.0.1 。
总结
在本教程中,我们了解了IP地址和它们的版本。我们还讨论了DNS和它的工作流程。
我们了解到IP地址和主机名是可以通过InetAddress类访问的。