java:获取本机IP,Linux环境下使用InetAddress.getLocalHost()方法获得127.0.0.1

article/2025/10/29 15:25:56

知道InetAddress.getLocalHost()方法是可以获取本地ip的,但是在mac电脑上执行的时候,偶尔会得到127.0.0.1的输出,这样拿到本地ip很不稳定,感觉就很不靠谱了

目录

  • InetAddress.getLocalHost()方法获取本地IP不靠谱
    • 原因
  • 获取本地IP的靠谱方法
    • 代码
    • 避坑
      • 注意代码中是返回和网络接口绑定的所有IP地址
      • 解决

InetAddress.getLocalHost()方法获取本地IP不靠谱

代码

    public static void main(String[] args) throws Exception {InetAddress addr = InetAddress.getLocalHost();System.out.println("Local HostAddress: "+addr.getHostAddress());String hostname = addr.getHostName();System.out.println("Local host name: "+hostname);}

mac上输出
在这里插入图片描述

原因

windows环境: 使用InetAddress.getLocalHost()方法看似正常能获得本地ip,实际也有不确定性(多网卡协同工作环境下是不准确的

Java 的InetAddress.java 调用 InetAddressImpl.java 的 public native String getLocalHostName() throws UnknownHostException;来获取本地主机名,是一个系统原生方法和ping hostname 返回的 IP 地址是同一个,并不是 ipconfig 方法得到的 eth0 的IP 地址.

默认情况下本机名是localhost,在host文件中对应的ip是127.0.0.1,所以通过这个函数获取到的ip就是127.0.0.1了

即它就是简单的读取/etc/hosts的内容,所以它默认返回的是127.0.0.1非常的不靠谱,因此本方法十分不建议在生产上使用。

不如我们来看一下 /etc/hosts

在这里插入图片描述

/etc/hosts的第一行一般均是:127.0.0.1 localhost,所以返回值是127.0.0.1(倘若你把第一行改为127.1.1.1 localhost,那么它的返回值就是127.1.1.1了)

获取本地IP的靠谱方法

从JDK1.4开始,Java提供了一个NetworkInterface类。这个类可以得到本机所有的物理网络接口和虚拟机等软件利用本机的物理网络接口创建的逻辑网络接口的信息,NetworkInterface可以通过getNetworkInterfaces方法来枚举本机所有的网络接口。我们也可以利用getNetworkInterfaces得到的网络接口来枚举本机的所有IP地址。

NetworkInterface类提供了三个方法可以分别得到网络接口名(getName方法)、网络接口别名(getDisplayName方法)以及和网络接口绑定的所有IP地址(getInetAddresses方法)

代码

windows和linux下通用的获取本机IP的方法

package test;import java.io.IOException;
import java.net.*;
import java.util.Enumeration;/*** @author yanZhiHang* @date 2023/2/2 11:59*/
public class GetLocalHost {public static void main(String[] args) throws Exception {InetAddress addr = InetAddress.getLocalHost();System.out.println("Local HostAddress: "+addr.getHostAddress());String hostname = addr.getHostName();System.out.println("Local host name: "+hostname);System.out.println("本机ip:" + getIpAddress());}public static String getIpAddress() {try {//从网卡中获取IPEnumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();InetAddress ip;while (allNetInterfaces.hasMoreElements()) {NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();//用于排除回送接口,非虚拟网卡,未在使用中的网络接口if (!netInterface.isLoopback() && !netInterface.isVirtual() && netInterface.isUp()) {//返回和网络接口绑定的所有IP地址Enumeration<InetAddress> addresses = netInterface.getInetAddresses();while (addresses.hasMoreElements()) {ip = addresses.nextElement();if (ip instanceof Inet4Address) {return ip.getHostAddress();}}}}} catch (Exception e) {System.err.println("IP地址获取失败" + e.toString());}return "";}
}

避坑

注意代码中是返回和网络接口绑定的所有IP地址

⚠️我这边服务器有docker容器,结果根据上述代码获取本地IP的时候,获取的是docker对外的网卡ip,结果导致获取先获取到了docker对外的网卡ip。同时也有可能存在多个网卡,影响获取真正的IP

解决

因为我真实目的是校验输入的IP是否为本机ip,所以只要证明网络接口中的所有IP包含输入的IP即可

改造后的代码

    public static boolean isLocalHost(String localHost) throws Exception {try {Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();while (allNetInterfaces.hasMoreElements()) {NetworkInterface netInterface = allNetInterfaces.nextElement();if (!netInterface.isLoopback() && !netInterface.isVirtual() && netInterface.isUp()) {Enumeration<InetAddress> addresses = netInterface.getInetAddresses();while (addresses.hasMoreElements()) {InetAddress ip = addresses.nextElement();if (null != ip && ip.getHostAddress().contains(localHost)) {return true;}}}}} catch (Exception e) {log.error("校验IP地址失败:", e.getCause());e.printStackTrace();throw new Exception(e);}return false;}

参考
java获取本机IP


http://chatgpt.dhexx.cn/article/rB0Ia34b.shtml

相关文章

java获取本地Ip

程序人生 前言一、传统方式二、新方式三、测试 前言 今天玩了一天&#xff08;愧疚中&#xff09;&#xff0c;写一个简单的获取自己本地ip的一个工具类&#xff0c;可以拿到自己的本地ip&#xff0c;也是这两天用了自己研究了一下&#xff0c;记录下来方便理解。 一、传统方…

Java 获取本机的外网 IP

原理 通过 HTTP 访问第三方获取 IP 的服务接口获取本机的外网 IP&#xff0c;例如&#xff1a; http://checkip.amazonaws.com/https://ipv4.icanhazip.com/http://bot.whatismyipaddress.com/等等… 考虑到这些第三方接口不一定 100% 稳定&#xff0c;例如可能出现下线、错…

video.js 源码分析(JavaScript)

video.js 源码分析&#xff08;JavaScript&#xff09; 组织结构继承关系运行机制 插件的运行机制 插件的定义插件的运行控制条是如何运行的UI与JavaScript对象的衔接 类的挂载方式 存储获取 组织结构 以下是video.js的源码组织结构关系&#xff0c;涉及控制条、菜单、浮层、进…

在网站中使用VideoJs视频播放器播放视频

之前使用videojs用来网页中播放视频&#xff0c;现在做一下总结 &#xff08;这里把插件下载及演示地址、使用方法及demo放出来&#xff09; 视频播放插件Video.js 插件下载地址&#xff1a; http://www.jq22.com/jquery-info404 演示播放视频地址&#xff1a;http://www.jq…

video.js的使用,打造自定义视频播放器(综合详解,可收藏)

video.js的使用&#xff0c;打造自定义视频播放器&#xff08;综合详解&#xff0c;可收藏&#xff09; 一、视频初始化&#xff1a;1、直接在viedo的HTML标签中 初始化,标签里面加上 class"video-js" 和 data-setup{} 属性&#xff0c;例如&#xff1b;2、使用js初…

vue 视频播放插件vue-video-player自定义样式、自动播放设置、设置一开始全屏播放视频、监听全屏事件

1、背景 项目中有涉及视频播放的需求&#xff0c;并且UI设计了样式&#xff0c;与原生的视频video组件有差异&#xff0c;所以使用了vue-video-player插件&#xff0c;并对vue-video-player进行样式改造&#xff0c;自定义播放暂停按钮、全屏按钮、时间进度条样式等&#xff0…

关于谷歌浏览器62版本之后引用video.js不能自动播放的问题(Cross-origin plugin content from http://vjs.zencdn.net/swf/5.0.0-rc

Cross-origin plugin content from http://vjs.zencdn.net/swf/5.0.0-rc1/video-js.swf must have a visible size larger than 400 x 300 pixels, or it will be blocked. Invisible content is always blocked.这句话的意思是&#xff1a;来自http://vjs.zencdn.net/swf/5.0.…

videojs播放器插件使用详解

HTTP stream是各家自己定义的http流&#xff0c;应用于国内点播视频网站。 HLS是苹果公司实现的基于 HTTP 的流媒体传输协议&#xff0c;全称 HTTP Live Streaming&#xff0c;可支持流媒体的直播和点播&#xff0c;主要应用在 iOS 系统&#xff0c;为 iOS 设备&#xff08;如…

videojs-flash.min.js 报错 this.el_.vjs_getProperty is not a function

videojs-flash.min.js 报错 this.el_.vjs_getProperty is not a function 没发现有什么好的解决方法&#xff0c;目前我的问题&#xff0c;就是切换页面的时候或出现这个问题&#xff0c;我猜测是因为this指向变了导致的&#xff0c;我的处理方法就是开个定时器&#xff0c;定时…

this.el_.vjs_getProperty is not a function

前言&#xff1a; 在使用video.js播放rtmp视频中切换页面&#xff0c;如果是弹框引入&#xff0c;关闭弹框时&#xff0c;必然会发现控制台报错这个&#xff0c;这是谈谈我这边遇到的这个问题&#xff0c;以及怎么解决的。 问题&#xff1a; 在说这个问题怎么解决之前&#xf…

Video.js使用教程一(详解)

在项目上遇到类似于直播的场景所以需要前端播放后台的视频流这个问题&#xff0c;所以就此问题记录一下&#xff0c; 在上一篇文章中写到了怎样搭建nginx流媒体服务器以及怎样使用ffmpeg进行推流&#xff0c;那么现在就缺前端拉流这一部分&#xff0c;通过这两个天的辛勤劳动终…

MySQL 导出 CSV 乱码

2019独角兽企业重金招聘Python工程师标准>>> 从MySQL导出数据到 csv 文件后&#xff0c;有时会发现用 excel 打开该导出 csv 文件显示的是乱码&#xff08;不得不说WPS是神器&#xff0c;打开不会乱码 office打开会乱码&#xff09;。这个问题是 csv 文件本身的文本…

Mac中解决CSV乱码问题

新建一个Excel文件&#xff0c;选择文件–》导入 2.选择CSV文件导入 3.“文件导入向导-第1步”弹框中“文件原始格式”选择"Unicode(UTF-8)"&#xff0c;点击下一步 4.“文件导入向导-第2步”中勾选“逗号” 5.“文件导入向导-第3步”保持默认选项&#xff0c;点击…

jemter读取csv乱码

目录 【问题描述】【解决方案】 【问题描述】 已经根据 jmeter读取csv报错配置后&#xff0c;执行压测脚本&#xff0c;jmeter读取csv乱码&#xff0c;请求信息中为乱码&#xff0c;但是不影响交易结果&#xff08;后续有导致交易失败&#xff0c;不知道是否因为乱码引起&…

java csv导出 乱码_java导出csv乱码解决方法介绍

1、问题 将查询的数据以xls文件导出时(UTF-8编码)&#xff0c;数据正常&#xff1b;但以CSV文件导出时&#xff0c;文件中的中文乱码&#xff0c;同样是UTF-8编码&#xff0c;改成GBK编码导出时&#xff0c;中文显示正常。 本以为问题解决&#xff0c;后面导出含拉丁字符(如)的…

win10打开csv乱码

解决方法&#xff1a; 1、打开Excel&#xff1b; 2、点击任务栏的<数据>&#xff1b; 3、点击<从文本/CSV>选择csv文件&#xff1b; 4、修改文件原始格式为&#xff1a;65001&#xff1a;Unicode(UTF-8); 5、点击加载&#xff0c;即可&#xff1b; 6、将文件另存为…

python写入csv中文乱码

利用python写入csv文件打开发现中文乱码。查找资料发现需要修改编码格式&#xff0c;我原来的写法是&#xff1a; f open(51招聘数据-金融分析2.csv,modea,encodingutf-8,newline)试了一下网上的修改encoding为utf-8-sig和gbk&#xff0c;最终发现’gbk’格式的编码是可行的。…

【csv乱码】csv文件打开乱码的情况

先选择“记事本”打开方式打开&#xff0c;打开肯定还是乱码的状态。 不用慌&#xff0c;点击 选择“另存为”该记事本为csv格式&#xff0c;并且选择编码格式为“带有BOM的UTF-8”&#xff08;默认会选择UTF-8&#xff0c;并不能解决乱码的问题&#xff09;。打开另存为的cs…

mysql导入CSV乱码问题解决

错误出现页面 MySQL在导入CSV的时候&#xff0c;其中的中文乱码 解决方案 1.右键该CSV&#xff0c;用记事本打开 2.点击文件–>另存为—>修改编码为UTF-8,再导入新的的CSV就可以了

python写入csv乱码问题

原代码&#xff1a; with open(csv_path, open_mode, newline)as f:f_csv_write csv.writer(f)f_csv_write.writerow(row) 乱码截图&#xff1a; 解决办法&#xff1a; 因为python创建csv文件默认的是ansi格式的&#xff0c;而程序中是utf-8的格式进行保存的&#xff0c;所以…