当前位置:   article > 正文

解决linux下java代码获取不到本机ip地址_issitelocaladdress

issitelocaladdress

        今天在部署完预生产环境的时候发现一个问题,在linux下面java代码获取本机ip地址获取不到。但是我在测试环境上面是能够获取到的。先粘下获取本机ip的代码:

  1. try{
  2. Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();
  3. InetAddress addr = null;
  4. while (allNetInterfaces.hasMoreElements())
  5. {
  6. NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();
  7. //System.out.println(netInterface.getName());
  8. Enumeration<InetAddress> addresses = netInterface.getInetAddresses();
  9. while (addresses.hasMoreElements())
  10. {
  11. InetAddress ipTmp = (InetAddress) addresses.nextElement();
  12. if(ipTmp != null && ipTmp instanceof Inet4Address
  13. && ipTmp.isSiteLocalAddress()
  14. && !ipTmp.isLoopbackAddress()
  15. && ipTmp.getHostAddress().indexOf(":")==-1){
  16. addr = ipTmp;
  17. }
  18. }
  19. }
  20. if(addr == null) throw new SystemException("获取本机ip异常");
  21. return addr;
  22. }catch(SocketException e){
  23. e.printStackTrace();
  24. throw new SystemException("获取本机ip异常");
  25. }

 

这样的代码就不多解释了,网上一找一大把。 于是又把服务器的ip配置拿出来

 

 

 

似乎ip看起来也没有什么问题,没办法了只能一步步调试代码了,于是打上日志看看。

看到的日志服务器ip地址也能获取出来,但是结合上面的代码看有个条件是不满足的,isSiteLocalAddress()这个方法返回是false,按理说应该是true才对,这方法是javaAPI提供的,然后看下这个方法的源码:

  1. /**
  2. * Utility routine to check if the InetAddress is a site local address.
  3. *
  4. * @return a <code>boolean</code> indicating if the InetAddress is
  5. * a site local address; or false if address is not a site local unicast address.
  6. * @since 1.4
  7. */
  8. public boolean isSiteLocalAddress() {
  9. // refer to RFC 1918
  10. // 10/8 prefix
  11. // 172.16/12 prefix
  12. // 192.168/16 prefix
  13. int address = holder().getAddress();
  14. return (((address >>> 24) & 0xFF) == 10)
  15. || ((((address >>> 24) & 0xFF) == 172)
  16. && (((address >>> 16) & 0xF0) == 16))
  17. || ((((address >>> 24) & 0xFF) == 192)
  18. && (((address >>> 16) & 0xFF) == 168));
  19. }

恍然大悟原来私有ip地址是有范围限制的,

对着服务器上面的ip一看,果然是不在这个范围内。这实施小哥把公有的ip拿来配成私有的,导致获取不到ip。把ip配置成私有ip的范围问题也就解决了。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/88788
推荐阅读
相关标签
  

闽ICP备14008679号