由于getHostAddress()方法在Linux下读取hosts文件获取的是127.0.0.1

InetAddress.getLocalHost().getHostAddress()

所以这里采用NetworkInterfaces + getInetAddresses来获取IP地址

import org.apache.commons.lang3.StringUtils;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration; /**
* @Description 网络工具包
* @Author lay
* @Date 2019/01/23 14:13
*/
public class NetUtil {
private static volatile String ip = ""; /**
* 通过NetworkInterfaces + getInetAddresses 获取IP地址
* 注意:
* 1)本方法将获取第一个ipv4地址,如果系统存在如虚拟机等将会有多个ipv4地址可选,可能导致获取到虚拟机地址
* 2)由于该方法要遍历逻辑网络接口,是一个重量级方法,这里采用static来确保全局只获取一次
* 3)为防止当前JVM中多次调用并发耗费资源,这里采用类锁控制
* @return IP地址
* @throws BusinessException 获取系统IP失败,getNetworkInterfaces()如果发生IO异常
*/
public static String getHostAddress() {
// 如果已经获取到了直接返回
if (StringUtils.isNotEmpty(ip)) {
return ip;
}
synchronized (NetUtil.class) {
if (StringUtils.isNotEmpty(ip)) {
return ip;
}
// 枚举所有逻辑网络接口
Enumeration<NetworkInterface> en;
try {
en = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
throw new BusinessException(ReturnStatus.SC_INTERNAL_SERVER_ERROR, "获取网络逻辑接口发生IO异常", e);
}
// 遍历所有接口
a: while (en.hasMoreElements()) {
NetworkInterface networkInterface = en.nextElement();
// 遍历该接口的所有地址
for (Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses(); inetAddresses.hasMoreElements(); ) {
InetAddress inetAddress = inetAddresses.nextElement();
String address = inetAddress.getHostAddress();
// 排除ip6等其它选项
if (!address.contains("::") && !address.contains("0:0:") && !address.contains("fe80")) {
// 排除127
if (!inetAddress.isLoopbackAddress() && inetAddress.isSiteLocalAddress()) {
// 赋值到静态变量
ip = address;
// 取第一个即结束
break a;
}
}
}
}
}
if (StringUtils.isEmpty(ip)) {
throw new BusinessException(ReturnStatus.SC_INTERNAL_SERVER_ERROR, "未能获取本机IP,IP=" + ip);
}
return ip;
}
}

这种获取方式实际上也可能存在问题,如使用了VM或者docker之类的东西,那么获取的时候会获取到多个并且无法区分是不是本机的IP,所以这里只取了第一个IP即break到a的位置。使用的时候需要注意服务器环境是否会造成这样的影响

四、获取IP地址工具包的更多相关文章

  1. PHP 获取IP地址位置信息「聚合数据API」

    聚合数据 提供了[查询IP所属区域]的服务接口,只需要以 GET 请求的方式向 API 传入 IP地址 和 APPKEY 即可获得查询结果. 这里的难点主要在于如何通过PHP获取客户端IP地址,以及如 ...

  2. DHCP获取IP地址过程中捕获的报文—三级网络总结(二)

    上一篇文章主要说了一下知识点中的IP地址的考点,这一篇我打算说说DHCP获取IP地址过程中捕获的报文的这个考点,都是自己的理解,有错误欢迎指正. DHCP是应用层协议,UDP是传输层协议,IP是网络层 ...

  3. 转 .net 获取IP地址的三个方法的比较

    获取用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)   一.没有使用代理服务器的情况: REMOTE_ADDR = 您的 IP    ...

  4. windows下获取IP地址的两种方法

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  5. 【PHP开发篇】一个统计客户端商机提交的获取IP地址

    1.对客服提交数据的ip地址记录. 获取ip地址的方法: public function getIP() { global $ip; if (getenv("HTTP_X_REAL_IP&q ...

  6. 获取 IP 地址

    package j2se.core.net.base; import java.net.InetAddress;import java.net.UnknownHostException; public ...

  7. js获取IP地址方法总结_转

    js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338.html 1,js取得IP地址 ...

  8. iOS 获取IP地址

    一.获取本机IP地址 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #import <ifadd ...

  9. Linux下Python获取IP地址

    <lnmp一键安装包>中需要获取ip地址,有2种情况:如果服务器只有私网地址没有公网地址,这个时候获取的IP(即私网地址)不能用来判断服务器的位置,于是取其网关地址用来判断服务器在国内还是 ...

随机推荐

  1. Backbone学习笔记 - View篇

    Backbone是一种Web端的MVC框架,这里纪录学习Model,View和Collection的笔记. 1 View initialize构造函数 Backbone.View 与jQuery库紧密 ...

  2. day 23 面向对象的命名空间与组合

    创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 1. 静态属性就是直接在类中定义的变量 2.动态属性就是定义在类中的方法. 其 ...

  3. Backtracking-401. Binary Watch

    A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom ...

  4. git修改文件权限方式

    查看Repository中文件权限 git ls-tree HEAD 100644 blob 018321abfbff52d175a788597f5b5f3f17f67dc7 .gitignore 1 ...

  5. 【wireshark】总体结构

    1. 总体结构 wireshark的总体结构如下图所示. 2. 功能模块 模块名 功能 源码子目录 GTK/Qt 处理所有的用户输入/输出(所有的窗口,对话框等等) /ui GTK: /ui/gtk ...

  6. android 代码实现back键功能

    方案一,简单但响应慢: doExec("input keyevent 4"); public String doExec(String cmd) { String s = &quo ...

  7. iOS-CocoaPods安装及使用

    1. 安装 Ruby 对于iOS开发者,CocoaPods是最方便的第三方管理工具了,但是怎么安装CocoaPods呢,安装CocoaPods之前,要确保mac已经安装上Ruby,但在安装Ruby时, ...

  8. js实现双向链表, 双向链表需要增加一个previous属性

    双向链表, 双向链表需要增加一个previous属性 /*双向链表 * */ function Node(element) { this.element = element; this.next = ...

  9. RabbitMQ : 几种Exchange 模式

    AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列.生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机.先由Exchange来接收,然后Exchang ...

  10. liunx相关指令

    修改网卡命名规范 ​ a 如何进入到救援模式 修改网卡 1.修改配置文件名称 /etc/sysconfig/network-scripts/
 名称为:ifcfg-xxx 2.修改配置文件内的 dev ...