java获取linux服务器上的IP操作

 更新时间:2020年08月20日 09:00:56   作者:gzy_0412  
这篇文章主要介绍了java获取linux服务器上的IP操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

在编码过程中需要获取本地IP地址,首先使用的是下面的方法,在Windows环境正常,但是linux服务器上就获取不到,

public static String getIpAddress() {
 String hostAddress = "";
 try {
  InetAddress address = InetAddress.getLocalHost();
  hostAddress = address.getHostAddress();
 
 } catch (UnknownHostException e) {
  e.printStackTrace();
 }
 return hostAddress;
 }

这样在linux上依然获取到的是127.0.0.1,

查询服务器上面IP发现:

[mm_cbms1@localhost ~]$ ip address

1:

lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever

2:

eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:50:56:a2:0d:1b brd ff:ff:ff:ff:ff:ff
inet 10.12.8.243/24 brd 10.12.8.255 scope global eth0
inet6 fe80::250:56ff:fea2:d1b/64 scope link

valid_lft forever preferred_lft forever

这里首先要了解上面列出的接口中的含义:

1、linux的网络接口之扫盲

(1) 网络接口的命名

这里并不存在一定的命名规范,但网络接口名字的定义一般都是要有意义的。例如:

eth0: ethernet的简写,一般用于以太网接口。

wifi0:wifi是无线局域网,因此wifi0一般指无线网络接口。

ath0: Atheros的简写,一般指Atheros芯片所包含的无线网络接口。

lo: local的简写,一般指本地环回接口。

(2) 网络接口如何工作

网络接口是用来发送和接受数据包的基本设备。

系统中的所有网络接口组成一个链状结构,应用层程序使用时按名称调用。

每个网络接口在linux系统中对应于一个struct net_device结构体,包含name,mac,mask,mtu…信息。

每个硬件网卡(一个MAC)对应一个网络接口,其工作完全由相应的驱动程序控制。

(3) 虚拟网络接口

虚拟网络接口的应用范围非常广泛。最着名的当属“lo”了,基本上每个linux系统都有这个接口。

虚拟网络接口并不真实地从外界接收和发送数据包,而是在系统内部接收和发送数据包,因此虚拟网络接口不需要驱动程序。

虚拟网络接口和真实存在的网络接口在使用上是一致的。

(4) 网络接口的创建

硬件网卡的网络接口由驱动程序创建。而虚拟的网络接口由系统创建或通过应用层程序创建。

驱动中创建网络接口的函数是:register_netdev(struct net_device *)或者register_netdevice(struct net_device *)。

这两个函数的区别是:register_netdev(…)会自动生成以”eth”作为打头名称的接口,而register_netdevice(…)需要提前指定接口名称.事实上,register_netdev(…)也是通过调用register_netdevice(…)实现的。

2、LINUX中的lo(回环接口)

1) 什么是LO接口?

在LINUX系统中,除了网络接口eth0,还可以有别的接口,比如lo(本地环路接口)。

2) LO接口的作用是什么?

假如包是由一个本地进程为另一个本地进程产生的, 它们将通过外出链的'lo'接口,然后返回进入链的'lo'接口。

其实getLocalHost方法获取的是lo接口对应的IP地址,了解了上述问题那java编码如何获取正确的地址呢?

java为了方便网络编程,提供了表示IP地址的类、表示网络接口(这个接口是指网卡)的类,表示网络连接接口的类,例如InetAddress,但是测试发现NetworkInterface类同样提供了获取本地计算机网络接口相关的信息的方法。尽管InetAddress类提供获取IP地址的方法,但是要想获取本机的网络接口的详细信息,还需要依赖NetworkInterface接口中的方法。测试发现下面方法可以获得服务器对应的IP地址,在linux服务器上和本地测试通过

(1)

public static String getInet4Address() {
 Enumeration<NetworkInterface> nis;
 String ip = null;
 try {
  nis = NetworkInterface.getNetworkInterfaces();
  for (; nis.hasMoreElements();) {
  NetworkInterface ni = nis.nextElement();
  Enumeration<InetAddress> ias = ni.getInetAddresses();
  for (; ias.hasMoreElements();) {
   InetAddress ia = ias.nextElement();
   //ia instanceof Inet6Address && !ia.equals("")
   if (ia instanceof Inet4Address && !ia.getHostAddress().equals("127.0.0.1")) {
   ip = ia.getHostAddress();
   }
  }
  }
 } catch (SocketException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 return ip;
 }

(2)

public static InetAddress getCurrentIp() {
    try {
      Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
      while (networkInterfaces.hasMoreElements()) {
        NetworkInterface ni = (NetworkInterface) networkInterfaces.nextElement();
        Enumeration<InetAddress> nias = ni.getInetAddresses();
        while (nias.hasMoreElements()) {
          InetAddress ia = (InetAddress) nias.nextElement();
          if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) {
            return ia;
          }
        }
      }
    } catch (SocketException e) {
     logger.error(e.getStackTrace());
    }
    return null;
  }

上述两个方法都可以获取正确的IP地址,具体NetworkInterface的使用还需要以后应用到了进行深入研究一下

补充知识:Java获取所有网卡IP地址

Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
    while (networkInterfaces.hasMoreElements()) {
      NetworkInterface networkInterface = networkInterfaces.nextElement();
      Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
      while (inetAddresses.hasMoreElements()) {
        InetAddress inetAddress = inetAddresses.nextElement();
        if (inetAddress.isLoopbackAddress()) {//回路地址,如127.0.0.1
        	System.out.println("loop addr:" + inetAddress);
        } else if (inetAddress.isLinkLocalAddress()) {//169.254.x.x
        	System.out.println("link addr:" + inetAddress);
        } else {
          //非链接和回路真实ip
        	System.out.println("ip:" + inetAddress);
        }
      }
    }

结果:

loop addr:/127.0.0.1
loop addr:/0:0:0:0:0:0:0:1
ip:/192.168.10.89

以上这篇java获取linux服务器上的IP操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JDK8中新增的Optional工具类基本使用

    JDK8中新增的Optional工具类基本使用

    Optional不是对null关键字的一种替代,而是对于null判定提供了一种更加优雅的实现,接下来通过本文给大家分享JDK8中新增的Optional工具类基本使用,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • 详解Java的Hibernate框架中的List映射表与Bag映射

    详解Java的Hibernate框架中的List映射表与Bag映射

    这篇文章主要介绍了Java的Hibernate框架中的List映射表与Bag映射,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • 详解spring boot中使用JdbcTemplate

    详解spring boot中使用JdbcTemplate

    JdbcTemplate 是在JDBC API基础上提供了更抽象的封装,并提供了基于方法注解的事务管理能力。 通过使用SpringBoot自动配置功能并代替我们自动配置beans,下面给大家介绍spring boot中使用JdbcTemplate相关知识,一起看看吧
    2017-04-04
  • Spring boot应用启动后首次访问很慢的解决方案

    Spring boot应用启动后首次访问很慢的解决方案

    这篇文章主要介绍了Spring boot应用启动后首次访问很慢的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java遍历途中修改数据及删除数据的方法总结

    java遍历途中修改数据及删除数据的方法总结

    在使用java的集合类遍历数据的时候,在某些情况下可能需要对某些数据进行删除,下面这篇文章主要给大家介绍了关于java遍历途中修改数据及删除数据的方法总结,需要的朋友可以参考下
    2023-10-10
  • Spring事务事件监控的实现

    Spring事务事件监控的实现

    这篇文章主要介绍了Spring事务事件监控的实现。本文首先会使用实例进行讲解Spring事务事件是如何使用的,然后会讲解这种使用方式的实现原理。感兴趣的小伙伴们可以参考一下
    2018-10-10
  • spring event 事件异步处理方式(发布,监听,异步处理)

    spring event 事件异步处理方式(发布,监听,异步处理)

    这篇文章主要介绍了spring event 事件异步处理方式(发布,监听,异步处理),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Spring 校验(validator,JSR-303)简单实现方式

    Spring 校验(validator,JSR-303)简单实现方式

    这篇文章主要介绍了Spring 校验(validator,JSR-303)简单实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • springcloud nacos动态线程池Dynamic tp配置接入实战详解

    springcloud nacos动态线程池Dynamic tp配置接入实战详解

    这篇文章主要为大家介绍了springcloud nacos动态线程池Dynamic tp配置接入实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • java8中的lambda表达式简介

    java8中的lambda表达式简介

    Lambda表达式类似匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和方法名,这篇文章主要介绍了java8 中的lambda表达式简介,需要的朋友可以参考下
    2022-06-06

最新评论