InetAddress类

news2024/10/6 14:24:52

1. 简介

java.net.InetAddress类是Java对Ip地址的高层表示。大多数其他网络都要用到这个类,包括Socket、ServerSocket、URL、DatagramSocket、DatagramPacket等。一般来讲,它包括一个主机名和一个IP地址。它提供了获取和操作 IP 地址的方法,可以用于网络编程、服务器配置、主机管理等场景。InetAddress类的常用方法和功能包括:

  • 获取 IP 地址:

getByName(String host):通过主机名或 IP 地址字符串获取一个 InetAddress 对象。
getLocalHost():获取本地主机的 InetAddress 对象。

  • 获取主机名和 IP 地址信息:

getHostName():获取主机的主机名。
getHostAddress():获取主机的 IP 地址字符串。

  • 检查 IP 地址类型:

isLoopbackAddress():检查是否为回环地址(Loopback Address)。
isMulticastAddress():检查是否为组播地址(Multicast Address)。
isAnyLocalAddress():检查是否为通配地址(Any Local Address)。

  • 进行 IP 地址的比较和判断:

equals(Object obj):比较两个 InetAddress 对象是否相等。
hashCode():获取 IP 地址的哈希码值。

  • 获取与 IP 地址相关的其他信息:

getCanonicalHostName():获取规范的主机名。
getAddress():获取原始的 IP 地址字节数组。
toString():返回 IP 地址的字符串表示。

InetAddress类可以用于解析域名、获取主机的 IP 地址、判断 IP 地址的类型等操作。它是进行网络编程和系统配置的基础类之一。

2. 创建新的InetAddress对象

InetAddress类没有公共构造函数。实际上,InetAddress有一些静态工厂方法,可以连接到DNS服务器来解析主机名。最常用的是InetAddress.getByName

public class QuizCardBuilder {
    public static void main(String[] args) throws  UnknownHostException {
       InetAddress address=InetAddress.getByName("www.baidu.com");
        System.out.println(address);
    }
}

在这里插入图片描述
InetAddress address=InetAddress.getByName("www.baidu.com");该方法会建立一个与本地DNS服务器的一个连接,来查找名字和数字地址(如果你之前查找过这个主机,这个信息可以在本地缓存,如果是这样,就不用建立网络连接了)。如果DNS服务器找不到这个地址,则会抛出UnknownHostException异常。

getByName方法可以提供一个IP地址作为参数,会为所请求的IP地址创建一个InetAddress对象,但不会检查DNS,即它可能会为一个实际不存在的也无法连接的主机创建InetAddress对象,而只有显示的调用getHostName时才会完成真正的DNS查找,但如果没找到的话,也不会抛出UnKnownHostException异常,而是主机名继续保持原来的IP地址字符串

  • getLocalHost()方法,会为运行这个代码的主机返回一个InetAddress对象
public class QuizCardBuilder {
    public static void main(String[] args) throws  UnknownHostException {
       InetAddress address=InetAddress.getLocalHost();
        System.out.println(address);
    }
}

在这里插入图片描述

3. 缓存

由于DNS查找的开销可能相当大,所以InetAddress会缓存查找到的结果。一旦得到一个给定主机的地址,就不会再次查找地址。只要在程序运行期间IP地址没有改变,这就没有问题。这种方式的负面结果就是,有可能刚开始尝试解析一个主机失败,但随后再次尝试时会成功。因为从远程DNS服务器发来的信息孩子传输中,第一次尝试超时,然后这个地址到达本地DNS,所以下一次请求时可用。出于这个原因,Java对于不成功的DNS查询只缓存10s。其实这个时间可以通过系统属性来控制,networkaddress.cache.ttlnetworkaddress.cache.negative.ttl。其中第一个属性指定了成功的DNS查找结果缓存的时间,单位为s,后面一个属性指定了不成功的查找结果缓存的时间,单位为s。

4. 安全性问题

从主机名创建一个新的InetAddress对象被认为是一个潜在的不安全操作,因为这需要一个DNS查找。在默认的安全管理器控制下的不可信applet(一种可以嵌入到网页中的java程序)只允许获得它的初始主机的IP地址,这可能是本地主机。不允许不可信代码(指的是那些不受信任或来源不可靠的代码。不可信代码可能是来自第三方或外部系统的代码,或者是用户输入的代码。这些代码的执行可能具有潜在的安全风险或不可预测的行为)由任何其它主机创建InetAddress对象,不可信代码可以由字符串形式的IP地址构造InetAddress对象,但不会为这样的地址完成DNS查找。由于禁止与初始主机之外的主机建立网络连接,不可信的代码不允许对第三方的主机完成任意的DNS查找,任务的DNS查找会打开一个隐藏的通道,通过它,程序可以和第三方主机对话。由于任意DNS查找会泄露信息,所以要禁止任意的DNS查找。
不可信代码允许调用getLocalHost(),不过在这种环境下,getLocalHost()总是返回主机名localhost/127.0.0.1。禁止applet找出真正的主机名和地址的原因在于,运行applet的计算机可能故意隐藏在防火墙后面,在这种情况下,applet不应该作为通道来获取web服务器还没有的信息。但与所有的安全性检查一样,禁止DNS解析可以对可信代码放宽要求,要测试一个主机能否解析可以调用checkConnect方法:

public void checkConnect(String hostname,int port)

当port参数为1时,这个方法检查能否调用DNS解析指定的hostname(如果大于-1,这个方法检查是否运行在指定端口对指定主机建立连接)

5. 获取方法

InetAddress保护4个获取方法,可以将主机名作为字符串返回,将IP地址返回为字符串和字节数组:

public String getHostname()
public String getCanonicaHostName()
public byte[] getAddress()
public String getHostAddress()

没有对应的setHostname()和setAddress()方法,这说明java.net之外的包无法在后台改变InetAddress对象的字段,所以它是线程安全的

  • getHostname

该方法返回一个String对象,其中保护主机名字,以及这个InetAddress对象表示的IP地址。如果这台机器没有主机名或者安全管理器阻止确定主机名,就会返回分四段格式的IP地址。

  • getCanonicaHostName

该方法和getHostname方法类似,不过在与DNS联系方面更加积极,getHostName只是在不知道主机名时才会联系DNS,而该方法即使知道也会联系DNS,可能会替换原来缓存的主机名。

public class QuizCardBuilder {
    public static void main(String[] args) throws  UnknownHostException {
       InetAddress address=InetAddress.getByName("www.baidu.com");
        System.out.println(address.getCanonicalHostName());
        System.out.println(address.getHostName());
    }
}

在这里插入图片描述

6. 地址类型

有些IP地址和地址模式有特殊的含义。例如127.0.0.1时本地回送地址。224.0.0.0到239.255.255.255范围内的IPv4组播地址,可以同时发送到多个订阅的主机,java提供了10个方法来测试InetAddress对象是否符合其中某个标准:

public boolean isAnyLocalAddress() //检查是不是通配地址(匹配本地的任何地址)
public boolean isLoopbackAddress() //检查是不是回送地址(回送地址直接在IP层连接一台计算机)
public boolean isLinkLocalAddress() //检查是不是iPv6本地链接地址
public boolean isSiteLocalAddress() //检查是不是一个ipv6本地网站地址
public boolean isMulticastAddress() //检查是不是一个组播地址
public boolean isMCGlocal() //检查是不是一个全球组播地址
public boolean isMCNodeLocal() //检查是不是一个本地接口组播地址
public boolean isMCSiteLocal() //检查是不是网站范围组播地址
public boolean isMCOrgLocal() //检查是不是一个组织范围组播地址
public boolean isLinkLocal() //检查是不是一个字网范围组播地址

7. 测试可达性

InetAddress类有两个isReachable方法,可以测试一个特定的节点对当前主机是否可达,连接可能因为很多原因而阻塞,包括防火墙、代理服务器、行为失常的路由器和断开线缆等,或者只是因为试图连接时远程主机没有开机

public boolean isReachable(int timeout) throw IOException
public boolean isReachable(NetworkInterface interface,int ttl, int timeout)

这些方法尝试使用traceroute(更确切的说,就是ICMP echo请求)查看指定地址是否可达,如果主机在timeout时间内没有反应,则方法返回true,否则返回false。如果网络出现错误,则抛出IOException。第二个方法还允许指定从哪个本地网络接口建立连接,以及生成时间(连接被丢弃前尝试的最大网络跳数)

public class QuizCardBuilder {
    public static void main(String[] args) {
        try {
            // 使用默认超时时间的 isReachable 方法
            boolean isReachable = InetAddress.getByName("www.baidu.com").isReachable(5000);
            System.out.println("Default Timeout - Is host reachable? " + isReachable);

            // 使用指定网络接口、生存时间和超时时间的 isReachable 方法
            NetworkInterface networkInterface = NetworkInterface.getByName("eth0");
            boolean isReachableWithInterface = InetAddress.getByName("www.baidu.com")
                    .isReachable(networkInterface, 128, 5000);
            System.out.println("With Network Interface - Is host reachable? " + isReachableWithInterface);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

8. Object方法

java.net.InetAddress继承自java.lang.Object。因此,它可以访问Object类的所有方法。

  • equals():当两个InetAddress对象具有相同的IP地址时相等,并不要求拥有相同的主机名
  • hashcode():该方法返回int只根据IP地址来计算,它不考虑主机名
  • toString():可依返回对象的简单文字表示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/559787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OceanBase 4.1解读:我们支持MySQL 8.0哪些新增功能特性?

本文主要介绍 OceanBase 在 4.1 版本发布之际,对 MySQL 8.0 新增功能特性的支持情况。文章作者刘彬,OceanBase高级技术专家。曾参与 OceanBase RS、存储模块研发,目前是 SQL 执行组负责人。 MySQL 在业内是最受欢迎的关系数据库之一&#xff…

UOS下使用HHDESK文本对比功能

UOS系统从开发至今,虽然进展很大,但受限于一些因素,所支持的功能和软件,目前仍不多。 HHDESK便是其中佼佼者之一。 此篇介绍的便是HHDESK的一项便捷功能——文本对比。这个功能针对办公人员所开发,使得原本复杂的UOS…

SpringCloud-Gateway的详细讲解以及完整的示意图和代码演示

目录 SpringCloud Gateway 看一个需求,引出网关服务 Gateway 网络拓扑图-背下来 Gateway 是什么 Gateway 核心功能 Gateway VS Zuul Gateway 和Zuul 区别 Gateway 基本原理​编辑 解读: Route(路由) Predicate(断言) Filter(过滤) How It Works 工作机制…

Linux网络——shell编程之firewalld防火墙

Linux网络——shell编程之firewalld防火墙 一、firewalld概述二、iptables与firewalld的联系与区别1.iptables与firewalld的区别2.iptables与firewalld的联系 三、firewalld区域1.firewalld的九个区域2.firewalld区域介绍3.firewalld数据处理流程4.firewalld检查数据包源地址的…

【shell编程学习】反弹shell

反弹实验 机器IPwin10虚拟机192.168.242.129攻击机centos 虚拟机192.168.242.131靶机 1,win10机器安装Ncat 来监听端口 简单来说,就是下载netcat 安装包,解压,将nc.exe 复制到C:\Windows\System32的文件夹下。即可使用nc命令来…

悦亮少儿眼科樊广祥:远视储备是妈妈都该知道的眼科知识!

近视的“低龄化”和“高度化”问题日益严重,如何预防近视或推迟近视发生,已成为大家都非常关注的话题。这其中,“远视储备”一词也为越来越多的人所知晓。 为了帮助大家更好的理解远视储备、从而帮助孩子预防近视,悦亮少儿眼科(宁…

Java 期末复习进阶版

(一) 方法重载 1.同一个类中多个方法具有相同的方法名,不同的______称为方法的重载.(参数列表) 2.在某个类中存在一个方法:void getSort(int x),以下能作为这个方法的重载的声明的是(C). A)public getSort(float x) B)int getSort(int y) C)double getSort(int x,int y) D)vo…

Docker安装Yearning3.1.4/禅道18.4【亲测可用】

一、安装Yearning 1、建议先安装go 2、在mysql下新建yearning数据库: 进入mysql:docker exec -it 91ada9def680 /bin/bash 账号密码登录:mysql -uroot -p create database if not exists yearning default character set utf8mb4 collat…

MOSN 基于延迟负载均衡算法——走得更快,期待走得更稳

文|纪卓志(GitHub ID:jizhuozhi) 京东高级开发工程师 MOSN 项目 Committer 专注于云原生网关研发的相关工作,长期投入在负载均衡和流量控制领域 前言 这篇文章主要是介绍 MOSN 在 v1.5.0 中新引入的基于延迟的负载均衡算法#2…

指针---C语言

目录 前言: 一.指针基础 1.1内存单元 1.2内存单元和指针的大小 二.指针变量 2.1指针类型 2.2野指针 三.指针运算 四.指针和数组的关系 4.1下标与解引用的等价替换 4.2指针数组 五.二级指针 ❤博主CSDN:啊苏要学习 ▶专栏分类:C语言◀ C语言的…

如何获取HTTP请求时间与响应时间【附源码】

文章目录 一、问题描述二、抓包观察三、查找文档四、思考尝试五、精益求精六、源码解说 一、问题描述 今日遇到了一个问题,要去获取HTTP报文在请求和响应的时间,因为没有原生的API可以调用,所以需要一定的技巧~ 下面主体的框架和代码&#xf…

如何在 Linux 服务器上更改分区方案?

在 Linux 服务器上,分区方案对于数据存储和系统管理至关重要。当服务器的存储需求发生变化或者需要重新组织分区时,更改分区方案是一个常见的任务。 本文将详细介绍如何在 Linux 服务器上更改分区方案。 步骤一:备份数据 在更改分区方案之前…

Microsoft Office 2013安装

哈喽,大家好。今天一起学习的是office2013的安装,有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统:Windows 7 支持Win10安装,不建议Win11安装,不支持WinXP系统 系统类型:64位 演示版本…

Jmeter函数助手函数--计数器详解

函数 作用 ${__counter(,)} 计数器,每次加1 ${__dateTimeConvert(,,,)} 时间格式转换 ${__intSum(,,)} 整数相加 ${__P(,)} 获取属性 ${__setProperty(,,)} 设置属性 ${__Random(,,)} 随机数 ${__threadNum} 线程编号 ${__time(,)} 获取当前时间戳…

Axure教程-竖向堆叠图(中继器)

本文将教大家如何用AXURE中的中继器动态竖向堆叠图 一、效果介绍 如图: 预览地址:https://wo8zqr.axshare.com 下载地址:https://download.csdn.net/download/weixin_43516258/87810606 二、功能介绍 简单填写中继器内容即可生成动态竖向堆…

Day5 模块(单元)测试——单元测试、自顶向上测试、自下向上测试

Day5 模块(单元)测试——单元测试、自顶向上测试、自下向上测试 文章目录 Day5 模块(单元)测试——单元测试、自顶向上测试、自下向上测试什么是单元测试?单元测试结构化程序时代单元测试与使用单元测试的误解单元测试过程成本效率不高结论单元测试的优点测试用例白盒覆盖…

SAP 用CO13冲销工序报工,但是没有产生货物移动(TCODE:CO1P 、 SE38 :CORUPROC,CORUAFWP)

前言 通常情况下,对PPO做GI或GR的时候,出现的异常可以在COGI中间被列出;在这些数据进入COGI之前,系统会把这些数据记录在CO1P中;换句话说,系统有时会出现DB的更新延时,当延时发生的时候&#xf…

从零实现一个数据库(DataBase) Go语言实现版 6.持久化到磁盘

英文源地址 持久化至磁盘 前一章中的b树数据结构可以很容易地转存到磁盘上.让我们在它之上建立一个简单地kv存储. 由于我们的b树实现是不可变的, 我们将以仅追加的方式分配磁盘空间, 重用磁盘空间将推迟到下一章. 持久化数据的方式 正如前面章节所提到的, 将数据持久化到磁…

黑马程序员的基础班都是一些什么内容?

黑马推出了基础班的课程,各学科点击申请基础班试学 Java学科基础班 JavaSE基础基础班阶段一 课时:9天 技术点:60项 测验:1次 学习方式:线下面授 学习目标 1.掌握Java开发环境基本配置 2.掌握运算符、表达式、流程控制语句、数组等的使用 3.熟练使用IDEA开发工具…

SQL优化的思路和步骤

数据库优化 创建索引: 创建合适的索引提高查询速度 分库分表:当一张表的数据比较多或者一张表的某些字段的值比较多并且使用时改用水平分表和垂直分表来优化 读写分离(集群): 当一台服务不能满足需要时,采用读写分离的方式进行集群 缓存: 使用redis来进行缓存 …