文章目录

  • 前言
  • 一、规则
  • 二、获取
    • 1.使用
    • 2.工具类

前言

在Java中如何准确的获取到本机IP地址呢?网上大部分的做法是InetAddress.getLocalHost().getHostAddress()。这的确能获取到本机IP地址,但是是不准确的。因为忽略了一个问题,网络环境是多变的,一台计算机不同的网卡有多个IP地址,Lan、WiFi、蓝牙、热点、虚拟机网卡等。

一、规则

  • 127.xxx.xxx.xxx 属于 “loopback” 地址,即只能你自己的本机可见,就是本机地址,比较常见的有 127.0.0.1
  • 192.168.xxx.xxx 属于 private 私有地址 (site local address),属于本地组织内部访问,只能在本地局域网可见
  • 同样 10.xxx.xxx.xxx、从 172.16.xxx.xxx 到172.31.xxx.xxx 都是私有地址,也是属于组织内部访问
  • 169.254.xxx.xxx 属于连接本地地址(link local IP),在单独网段可用
  • 从 224.xxx.xxx.xxx 到 239.xxx.xxx.xxx 属于组播地址
  • 比较特殊的 255.255.255.255 属于广播地址
  • 除此之外的地址就是点对点的可用的公开 IPv4 地址

二、获取

1.使用

    public static void main(String[] args) throws SocketException {System.out.println( IpUtil.getLocalIp4Address().get().toString().replaceAll("/",""));}

2.工具类

package com.dingwen.test.utils;import org.springframework.util.ObjectUtils;import java.net.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Optional;/*** 获取本机IP 地址** @author dingwen* 2021.04.28 11:49*/
public class IpUtil {/** 获取本机所有网卡信息   得到所有IP信息* @return Inet4Address>*/public static List<Inet4Address> getLocalIp4AddressFromNetworkInterface() throws SocketException {List<Inet4Address> addresses = new ArrayList<>(1);// 所有网络接口信息Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();if (ObjectUtils.isEmpty(networkInterfaces)) {return addresses;}while (networkInterfaces.hasMoreElements()) {NetworkInterface networkInterface = networkInterfaces.nextElement();//滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头if (!isValidInterface(networkInterface)) {continue;}// 所有网络接口的IP地址信息Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();while (inetAddresses.hasMoreElements()) {InetAddress inetAddress = inetAddresses.nextElement();// 判断是否是IPv4,并且内网地址并过滤回环地址.if (isValidAddress(inetAddress)) {addresses.add((Inet4Address) inetAddress);}}}return addresses;}/*** 过滤回环网卡、点对点网卡、非活动网卡、虚拟网卡并要求网卡名字是eth或ens开头** @param ni 网卡* @return 如果满足要求则true,否则false*/private static boolean isValidInterface(NetworkInterface ni) throws SocketException {return !ni.isLoopback() && !ni.isPointToPoint() && ni.isUp() && !ni.isVirtual()&& (ni.getName().startsWith("eth") || ni.getName().startsWith("ens"));}/*** 判断是否是IPv4,并且内网地址并过滤回环地址.*/private static boolean isValidAddress(InetAddress address) {return address instanceof Inet4Address && address.isSiteLocalAddress() && !address.isLoopbackAddress();}/** 通过Socket 唯一确定一个IP* 当有多个网卡的时候,使用这种方式一般都可以得到想要的IP。甚至不要求外网地址8.8.8.8是可连通的* @return Inet4Address>*/private static Optional<Inet4Address> getIpBySocket() throws SocketException {try (final DatagramSocket socket = new DatagramSocket()) {socket.connect(InetAddress.getByName("8.8.8.8"), 10002);if (socket.getLocalAddress() instanceof Inet4Address) {return Optional.of((Inet4Address) socket.getLocalAddress());}} catch (UnknownHostException networkInterfaces) {throw new RuntimeException(networkInterfaces);}return Optional.empty();}/** 获取本地IPv4地址* @return Inet4Address>*/public static Optional<Inet4Address> getLocalIp4Address() throws SocketException {final List<Inet4Address> inet4Addresses = getLocalIp4AddressFromNetworkInterface();if (inet4Addresses.size() != 1) {final Optional<Inet4Address> ipBySocketOpt = getIpBySocket();if (ipBySocketOpt.isPresent()) {return ipBySocketOpt;} else {return inet4Addresses.isEmpty() ? Optional.empty() : Optional.of(inet4Addresses.get(0));}}return Optional.of(inet4Addresses.get(0));}
}

参考:

  • https://www.jianshu.com/p/f619663f0f0a.
  • https://www.cnblogs.com/starcrm/p/7071227.html.

Java 获取本机IP地址相关推荐

  1. 用java获取本机IP地址

    在网上找了几个用java获取本机IP地址的代码,发现都少都有些不完美,自己整理了一下.突然之间很想把自己的IP地址给获取了,虽然用系统自带命令可以得到,但自己想写一个程序获取一下,到网上搜索了一下ja ...

  2. java获取本机ip地址_代码片段:获取系统所有IP

    问题 在Windows系统中,可以支持多个网卡,比如有线的以太网卡,无线网卡,虚拟网卡等.如下图所示: 每一张网卡由不同的类型,也可以分别被用户启用或禁用. 对于单独一张给定的网卡,其IP地址可以是D ...

  3. 1.Java获取本机IP地址,主机名,域名

    1.如何在程序中获取本机的IP地址,主机名以及域名呢? 在java中,我们可以利用java.net.InetAddress这个类来实现. InetAddress 类提供了操作 IP 地址的各种方法.该 ...

  4. java 本机局域网真实ip_Java获取本机ip地址,并扫描本机所在局域网的电脑设备

    Java获取本机IP地址,并根据IP地址的网段,扫描局域网里面的电脑设备; import java.io.IOException; import java.net.Inet4Address; impo ...

  5. Java 网络实例一(获取指定主机的IP地址、查看端口是否已使用、获取本机ip地址及主机名、获取远程文件大小)

    获取指定主机的IP地址 import java.net.InetAddress; import java.net.UnknownHostException;public class GetIP {pu ...

  6. Java 程序获取本机 ip 地址

    Java程序获取本机ip地址: host_ip_list = new ArrayList<String>(); try {for (NetworkInterface networkInte ...

  7. qt获取本机全部ipv4_QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址...

    获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...

  8. java获取客户端的IP地址工具类

    java获取客户端的IP地址工具类 import java.net.InetAddress; import java.net.UnknownHostException;import javax.ser ...

  9. 常识-java获取本机ipv6地址以及关闭临时ipv6地址

    关闭临时ipv6地址 临时ipv6有助于本机安全,然而有时用不到,比如用其进行长久的ftp链接,随时待命是不合适的 右键管理员cmd,输入命令关闭临时ipv6 netsh interface ipv6 ...

  10. Go 学习笔记(79)— Go 标准库 net(获取本机IP地址)

    1. 获取本机 IP 地址 package mainimport ("fmt""net" )// 获取本机网卡IP func getLocalIP() (ipv ...

最新文章

  1. 【计算机网络】应用层 : 电子邮件 ( SMTP 协议 | MIME 协议 | POP3 协议 | IMAP 协议 | 基于万维网的电子邮件 )
  2. 用OleDb写的一个导出Excel的方法
  3. 10.2.3 基本属性
  4. redis基本类型以及优点特性
  5. JQuery中的样式操作
  6. WP7应用开发笔记(8) IP输入框控件
  7. 【本周面试题】第5周 - 开发工具相关
  8. angularjs学习笔记—工具方法
  9. BOSS直聘:2020一季度平均招聘薪资8609元 同比增长2.8%
  10. html 父元素右下角,html – 如何在父元素和父元素的兄弟元素上显示子元素?
  11. CTA策略05_AtrRsiStrategy
  12. TA505武器之隐形电子邮件窃取器
  13. 一个优化好的、成熟的代购网站需要哪些功能,操作流程又是怎么样的?
  14. 中值定理5-泰勒中值定理
  15. flask html 得到文本框 input的内容_你需要知道的HTML知识
  16. WXS:微信小程序版JavaScript
  17. Modelsim的使用方法
  18. C++ Primer 第5版--练习9.14
  19. T48568 【zzy】yyy送礼物
  20. java数据结构之数组

热门文章

  1. linux识别riser卡,一种应用在GPU服务器中可灵活配置的Riser卡的制作方法
  2. 优化算法 | 遗传算法(附Python代码)
  3. java ftps 证书_java – 连接到FTPS服务器
  4. 2020.10.30文献1:《滇中引水工程香炉山隧洞地应力特征及其活动构造响应》
  5. 三菱PLC FX5U 伺服机器人程序
  6. wpsmac和pc版的区别_Mac系统下金山WPS和微软Office 哪个更好更好用
  7. Android wifi信号强度显示流程
  8. android中打开地理位置,Android中获取地理位置经纬度
  9. 从openssl rsa pem文件中提取公私钥数据实现
  10. 超级高铁(Hyperloop)