InetAddress.getLocalHost()返回ip 地址异常听问题

最近把服务集群中的接口调用记录到日志中,用以记录每台主机上各服务的性能情况,部署后外现内网的服务器IP取的都是127.0.0.1 这个地址。查了下资料,现在把这个区别记录下:

如题,使用InetAddress.getLocalHost()返回了  hostname/ip
令我不解的是,ip与本机的IP不匹配。
解决问题的思路:
1)把这段程序拷贝到其它机器,执行结果正常,排除使用api不当的问题。
2)在/etc下查找返回的hostname值的位置,我使用的是geetoo Linux系统,返回/etc/conf.d/hostname
以同样的方式在另外一台机器上查找,另外一台机器使用的是redhat Linux, 位于/etc/sysconfig/network
,然后查看/etc/hosts,发现该机器上的对应hostname的值可以找到,并且对应为正确的ip地址。
于是,回到自己机器,查看/etc/hosts,将机器IP对应的hostname修改成/etc/conf.d/hostname一致。
问题解决。

3)没有查看InetAddress的源码,但可以猜测它检索/etc/hosts文件中对应hostname的值,然后返回IP。
为了验证该假设,修改/etc/hosts的hostname对应的IP的值,然后执行程序,结果与预测一致。

4)InetAddress查找IP地址是一个很方便的方法,但是我们需要考虑的问题的是,如果/etc/hosts不可靠,结果面目全非。在baidu上搜索的时候,有一个兄弟使用ProcessBuilder来执行/sbin/ipconfig 来获取对应eth0的地址,遭到了下面的同志抨击,使用InetAddress就可以了,现在分析来,使用ProcessBuilder来直接执行命令,获取结果是一个非常可靠的办法。一个大的系统如果这里有问题,就会是大问题。

5)解决问题的思路比问题的答案更有意思。

原文:http://blog.sina.com.cn/s/blog_4a1f59bf0100n2pe.html

时间: 2024-10-29 08:25:32

InetAddress.getLocalHost()返回ip 地址异常听问题的相关文章

写一个简单的python脚本来返回ip地址的掩码,子网个数等

如果我们想快速得到一个IP地址段有多少个ip,快速得到IP地址段的子网掩码,或者快速得到一个IP地址的二进制,那么可以来学习一下.本文利用python的一个IP分析模块IPy实现,首先安装IPy模块 wget https://pypi.python.org/packages/88/28/79162bfc351a3f1ab44d663ab3f03fb495806fdb592170990a1568ffbf63/IPy-0.83.tar.gz tar -xf IPy-0.83.tar.gz cd IP

Java知多少(103)网络编程之IP地址和InetAddress类

Java语言的优势之一是Java程序能访问网络资源.Java提供一系列的类支持Java程序访问网络资源. TCP/IP协议和IP地址 为了进行网络通信,通信双方必须遵守通信协议.目前最广泛使用的是TCP/IP协议,它是Internet中各方所遵循的公共协议.TCP(Transport Control Protocol)是一种传输控制协议,IP(Internet Protocol)是一种网际协议,TCP/IP代表这两个协议的. TCP/IP分为四个层次: 网络接口层:负责接收和发送物理帧: 网络层

坑爹的InetAddress getLocalHost函数

今天在跑dubbo 的 DemoService 2.5.4-SNAPSHOT版本的时候,遇到到一个奇怪的问题.consumer怎么都连接不上provider的服务.最后才发现是由于dubbo自 己实现的检测本地IP地址代码不够强壮造成的.你这里的provider实际上是运行在A地址上,但是dubbo检测到本地的IP地址是B,然后他在 zookeeper上注册自己的服务地址的时候,用的是这个B这个IP地址,那么当consumer连接到zookeeper上的时候,查询到 DemoService是在B

根据IP地址获取用户的mac地址

根据实际需要可以使用以下的代码 获取MAC地址. /**  * 根据IP地址获取mac地址  * @param ipAddress 127.0.0.1  * @return  * @throws SocketException  * @throws UnknownHostException  */ public static String getLocalMac(String ipAddress) throws SocketException, UnknownHostException { //

Java网络编程从入门到精通(8):用getAddress方法获得IP地址

getAddress方法和getHostAddress类似,它们的唯一区别是getHostAddress方法返回的是字符串形式的IP地址,而getAddress方法返回的是byte数组形式的IP地址.getAddress方法的定义如下: public byte[] getAddress() 这个方法返回的byte数组是有符号的.在Java中byte类型的取值范围是-128?127.如果返回的IP地址的某个字节是大于127的整数,在byte数组中就是负数.由于Java中没有无符号byte类型,因此

Java如何从IP地址查找主机名?

在Java编程中,如何从IP地址查询出主机名? 以下示例显示了如何通过net.InetAddress类的InetAddress.getByName()方法将指定的IP地址查到主机名称. package com.yiibai; import java.net.InetAddress; public class HostSpecificByIP { public static void main(String[] argv) throws Exception { InetAddress addr =

php中获取用户登陆的IP地址以及常规处理

本文为原创,转载请注明!  在我们开发多站点业务网站中,经常需要获取客户端的ip地址来给用户推荐其所在地址的信息的业务,用php获取客户端的ip地址,我们一般用到的PHP内置方法是$_SERVER['REMOTE_ADDR']. 但是这个函数只能获取访问者本地连接中设置的IP,局域网网关出口的IP地址,如果访问者使用代理服务器,将不获取代理服务器的IP,而是获取访问者网关的真实IP.如果将这个函数应用到限IP访问的网页中,别人即使通过限IP访问段中的代理服务器,也不能访问该页面. 所以我们一般为

Asp.net获取用户真实Ip地址

/// <summary> /// 获取远程访问用户的Ip地址 /// </summary> /// <returns>返回Ip地址</returns> protected string GetLoginIp() { string loginip = ""; //Request.ServerVariables[""]--获取服务变量集合 if (Request.ServerVariables["REMOTE_

PHP获取IP地址及根据IP判断城市实现城市切换或跳转

PHP获取IP地址 这个比较简单了,利用PHP自带函数就可以了,PHP中文手册看一下,都有现成的例子,就不过多说明了,直接上代码,A段: ? <? //PHP获取当前用户IP地址方法 $xp_UserIp = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"]; $xp_UserIp = ($xp_UserIp) ? $xp_