xiaoxia的gravatar头像
xiaoxia 2014-07-15 15:14:44
java获取主机IP地址,适用于Linux以及windows环境

java 中的 InetAddress.getLocalHost()
 

java获取主机IP地址,适用于Linux以及windows环境
在Inetaddress.getLocalHost()中最终调用的是Inet6AddressImpl.java(取决于你使用ipv4,还是ipv6) 中getLocalHostName的native代码

最终在native代码中

JNIEXPORT jstring JNICALL  
Java_java_net_Inet6AddressImpl_getLocalHostName(JNIEnv *env, jobject this) {  
    char hostname[NI_MAXHOST+1];  
  
    hostname[0] = '\0';  
    if (JVM_GetHostName(hostname, MAXHOSTNAMELEN)) {  
    /* Something went wrong, maybe networking is not setup? */  
    strcpy(hostname, "localhost");  
    } else {  
      .....  
  }  


JVM_GetHostName 的宏定义

JVM_LEAF(int, JVM_GetHostName(char* name, int namelen))  
  JVMWrapper("JVM_GetHostName");  
  return hpi::get_host_name(name, namelen);  
JVM_END 

在linux中的函数

inline int hpi::get_host_name(char* name, int namelen){  
  return ::gethostname(name, namelen);  


也就是通过调用linux 中的gethostname 内核函数

Linux 中的gethostname 实现

在linux中的hostname 是个变量,由系统初始话的时候, 在shell启动脚本 “/etc/rc.d/rc.sysinit” 中实现,主要是读取“/etc/sysconfig/network” 中的HOSTNAME的值

这里有几个注意点:

1. 如果文件中没有hostname,那么会使用默认的localhost

2. 如果发现hostname的值是localhost 或者 localhost.localdomain, 根据自己的实际ip查找/etc/hosts中这个ip对应的hostname。

3. 如果没有,则使用localhost 或者localhost.localdomain

可以通过命令

hostname xxx

修改hostname,且不需要重启。

 

 

下面是JAVA中判断是windows还是linux环境获取主机IP

/**
  * 获得主机IP
  *
  * @return String
  */
 public static boolean isWindowsOS(){
    boolean isWindowsOS = false;
    String osName = System.getProperty("os.name");
    if(osName.toLowerCase().indexOf("windows")>-1){
     isWindowsOS = true;
    }
    return isWindowsOS;
  }

  /**
    * 获取本机ip地址,并自动区分Windows还是linux操作系统
    * @return String
    */
  public static String getLocalIP(){
    String sIP = "";
    InetAddress ip = null; 
    try {
     //如果是Windows操作系统
     if(isWindowsOS()){
      ip = InetAddress.getLocalHost();
     }
     //如果是Linux操作系统
     else{
      boolean bFindIP = false;
      Enumeration<NetworkInterface> netInterfaces = (Enumeration<NetworkInterface>) NetworkInterface
        .getNetworkInterfaces();
      while (netInterfaces.hasMoreElements()) {
       if(bFindIP){
        break;
       }
       NetworkInterface ni = (NetworkInterface) netInterfaces.nextElement();
       //----------特定情况,可以考虑用ni.getName判断
       //遍历所有ip
       Enumeration<InetAddress> ips = ni.getInetAddresses();
       while (ips.hasMoreElements()) {
        ip = (InetAddress) ips.nextElement();
        if( ip.isSiteLocalAddress()  
                   && !ip.isLoopbackAddress()   //127.开头的都是lookback地址
                   && ip.getHostAddress().indexOf(":")==-1){
            bFindIP = true;
               break;  
           }
       }

      }
     }
    }
    catch (Exception e) {
     e.printStackTrace();
    }

    if(null != ip){
     sIP = ip.getHostAddress();
    }
    return sIP;
  }


最代码官方编辑于2014-7-19 12:44:19


打赏
最近浏览
qtter123  LV1 2021年8月13日
NullPointException2  LV9 2021年6月24日
zdm00000 2020年6月29日
暂无贡献等级
wei112233  LV15 2020年4月21日
hh6754  LV3 2020年3月21日
luomu123 2020年2月3日
暂无贡献等级
wywtiao  LV6 2019年12月3日
zzww123654  LV5 2019年12月2日
djh123  LV2 2019年11月1日
ainiyiwangnian 2019年6月25日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友