如何在Java中查询IP地址

427 阅读5分钟

如何在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工作流程的程序

我们需要以下条件。

  1. 两个DNS服务器
  2. 一个网络浏览器
  3. 一台电脑
  • 客户电脑向本地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类访问的。