Java准确地获取本地IP地址

摘要:
问题用Java获取本机IP地址,需要处理:1.多块网卡。方案HBase客户端获取本机IP的代码提供了一个很好的参考。

问题

用Java获取本机IP地址,需要处理:

1. 多块网卡。

2. 排除loopback设备、虚拟网卡

看似简单的代码,写起来还是要小心一些的。

方案

HBase客户端获取本机IP的代码提供了一个很好的参考。没有特殊需求的话,拷贝过去用吧:)

//From HBase Addressing.Java
private static InetAddress getIpAddress(AddressSelectionCondition condition) throwsSocketException {
    //Before we connect somewhere, we cannot be sure about what we'd be bound to; however,
    //we only connect when the message where client ID is, is long constructed. Thus,
    //just use whichever IP address we can find.
    Enumeration<NetworkInterface> interfaces =NetworkInterface.getNetworkInterfaces();
    while(interfaces.hasMoreElements()) {
      NetworkInterface current =interfaces.nextElement();
      if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
      Enumeration<InetAddress> addresses =current.getInetAddresses();
      while(addresses.hasMoreElements()) {
        InetAddress addr =addresses.nextElement();
        if (addr.isLoopbackAddress()) continue;
        if(condition.isAcceptableAddress(addr)) {
          returnaddr;
        }
      }
    }

    throw new SocketException("Can't get our ip address, interfaces are: " +interfaces);
  }

免责声明:文章转载自《Java准确地获取本地IP地址》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JAVA服务器搭建之问题总结python像操作文件一样操作内存的模块 StringIO下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

VMP加壳(二):VMP的虚拟化原理

由于CPU只能识别和执行二进制文件,并直接让硬件CPU执行虚拟机的二进制代码,因此只能考虑通过纯软件模拟虚拟机执行代码指令。为了在软件级别模拟CPU执行二进制代码指令,一般的虚拟机指令要么是操作寄存器,虚拟机指令的处理程序必须模拟这些函数。它用于指示虚拟CPU当前执行的代码。为了满足上述要点,2。VMP虚拟机的执行过程(1)考虑启动VT。...

Linux查看机器和硬盘的SN

查看硬件RAID中硬盘的SN#sas端口:[root@~]$smartctl-a/dev/sda dmegaraid,n***序列号:6RJ974SR***#sat端口[root@~]$smarttl-a/dev/sda-dsat+megaraid,n***序列号:6BRJ974SR***查看机器SN[root@~~]$dmidcode-t1**序列号...

Android:在任务列表隐藏最近打开的app

//schemas.android.com/apk/res/android“package=”com.li.test“android:versionName=”1.0“&gt:targetSdkVersion=”23“/&gt:allowBackup=”true“android:icon=”@mipmap/ic_launcher“androi...

数据可视化之powerBI技巧(十四)采悟:PowerBI中自制中文单位万和亿

最令人不快的事情之一是数据单元的设置。现在让我们看看如何通过设置测量值来切换单位。需要动态选择1万元和1亿元的单位进行显示。首先,手动创建单位表,然后使用单位表中的[unit]字段生成切片器。下一步是建立销售衡量标准。销售额=总和('订单'[销售额])为了按过滤单位显示销售额,SELECTEDVALUE函数可以根据切片器选择动态更改分母。如果切片器未进行任何...

antd中,popover 不同情境下设置不同背景图,无法设置className的情况

于是就想通过设置不同的status值来添加不同的className,以设置.ant-popover-inner的样式来设置背景图,当然,这样做有一个不完美的就是不能一步到位的全部改变,需要手动更改.ant-popover-placement-bottom˃.ant-popover-content˃.ant-popover-arrow来替换那个角角的值。问题就...

ES基本查询总结

ES与数据库比较查询操作Elasticsearch中当我们设置Mapping完毕后,就可以按照设定的方式导入数据。以下内容的原文需要参考ES官方文档1、结构化检索针对字段类型:日期、时间、数字类型,以及精确的文本匹配。结构化检索特点:*1)结构化查询,我们得到的结果总是非是即否,要么存于集合之中,要么存在集合之外。term查询是简单的,它接受一个字段名以及我...