`
san_yun
  • 浏览: 2663230 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

关于JAVA取本机ip的一些总结

 
阅读更多

通常绑定本机ip地址 一般如下

 

        InetSocketAddress address = new InetSocketAddress(port);
        Channel serverChannel = bootstrap.bind(address);

 

 

InetSocketAddress默认使用的是什么ip呢?看看内部代码就明白了:

public InetSocketAddress(int port) {
   this(InetAddress.anyLocalAddress(), port);
}

 

InetAddress.anyLocalAddress()一般就是0.0.0.0/0.0.0.0,如果我们有两块网卡,一块内网,一块外网,那么都能访问这个socket,这通常是不安全的。那么通过InetAddress.getLocalHost().getHostAddress()呢?

结果悲剧了,使用上面的代码取回的是127.0.0.1。

 

好了,看看dubbo是怎么解决,dubbo获取本机ip地址的方法封装在com.alibaba.dubbo.common.utils.NetUtils类里面。

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.util.regex.Pattern;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class NetUtils {

    private static final Logger  logger           = LoggerFactory.getLogger(NetUtils.class);

    private static final Pattern IP_PATTERN       = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");

    private static final Pattern LOCAL_IP_PATTERN = Pattern.compile("127(\\.\\d{1,3}){3}$");

    public static final String   ANYHOST          = "0.0.0.0";

    public static final String   LOCALHOST        = "127.0.0.1";

    private static boolean isValidAddress(InetAddress address) {
        if (address == null || address.isLoopbackAddress()) return false;
        String name = address.getHostAddress();
        return (name != null && !ANYHOST.equals(name) && !LOCALHOST.equals(name) && IP_PATTERN.matcher(name).matches());
    }

    public static boolean isLocalHost(String host) {
        return host != null && (LOCAL_IP_PATTERN.matcher(host).matches() || host.equalsIgnoreCase("localhost"));
    }

    public static boolean isAnyHost(String host) {
        return "0.0.0.0".equals(host);
    }

    private static volatile InetAddress LOCAL_ADDRESS = null;

    /**
     * 遍历本地网卡,返回第一个合理的IP。
     * 
     * @return 本地网卡IP
     */
    public static InetAddress getLocalAddress() {
        if (LOCAL_ADDRESS != null) {
            return LOCAL_ADDRESS;
        }
        InetAddress localAddress = getLocalAddress0();
        LOCAL_ADDRESS = localAddress;
        return localAddress;
    }

    private static InetAddress getLocalAddress0() {
        InetAddress localAddress = null;
        try {
            localAddress = InetAddress.getLocalHost();
            if (isValidAddress(localAddress)) {
                return localAddress;
            }
        } catch (Throwable e) {
            logger.warn("Failed to retriving ip address, " + e.getMessage(), e);
        }
        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            if (interfaces != null) {
                while (interfaces.hasMoreElements()) {
                    try {
                        NetworkInterface network = interfaces.nextElement();
                        Enumeration<InetAddress> addresses = network.getInetAddresses();
                        if (addresses != null) {
                            while (addresses.hasMoreElements()) {
                                try {
                                    InetAddress address = addresses.nextElement();
                                    if (isValidAddress(address)) {
                                        return address;
                                    }
                                } catch (Throwable e) {
                                    logger.warn("Failed to retriving ip address, " + e.getMessage(), e);
                                }
                            }
                        }
                    } catch (Throwable e) {
                        logger.warn("Failed to retriving ip address, " + e.getMessage(), e);
                    }
                }
            }
        } catch (Throwable e) {
            logger.warn("Failed to retriving ip address, " + e.getMessage(), e);
        }
        logger.error("Could not get local host ip address, will use 127.0.0.1 instead.");
        return localAddress;
    }

}

 简单的说就是通过NetworkInterface遍历网卡address,然后通过isValidAddress校验ip是否正常即可。需要注意的一点是,dubbo通过Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$")判断ip是否合法,也就是说不能保证只返回内网ip!


我把代码改了一下,保证只返回内网ip:

package com.duitang.dboss.util;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

/**
 * 
 * @author yunpeng
 *
 */
public class NetUtil {

    private static volatile InetAddress LOCAL_ADDRESS = null;

    /**
     * 遍历本地网卡,返回内网IP。
     * 
     * @return 本地网卡IP
     */
    public static InetAddress getLocalAddress() {
        if (LOCAL_ADDRESS != null) {
            return LOCAL_ADDRESS;
        }
        InetAddress localAddress = getLocalAddress0();
        LOCAL_ADDRESS = localAddress;
        return localAddress;
    }
    
    private static InetAddress getLocalAddress0() {
      
        try {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface network = interfaces.nextElement();
                Enumeration<InetAddress> addresses = network.getInetAddresses();
                while (addresses != null && addresses.hasMoreElements()) {
                    InetAddress address = addresses.nextElement();
                    if (address != null && !address.isLoopbackAddress()) {

                        String name = address.getHostAddress();
                        if (name != null && name.startsWith("192.168")) {
                            return address;
                        }
                    }
                }
            }
        } catch (SocketException e) {
            throw new RuntimeException(e);
        }
        throw new RuntimeException("Could not get local host ip address!");
    }
    
    public static void main(String[] args) {
        System.out.println(NetUtil.getLocalAddress().getHostAddress());
    }
}

 

 

 

分享到:
评论

相关推荐

    java获取公网IP

    总结来说,Java获取公网IP地址主要依赖于网络请求和第三方服务的配合。`ExternalIpAddressFetcher.java` 类提供了一个简单的方法来实现这个功能,通过向Amazon AWS提供的公共IP检查服务发起HTTP请求,并解析返回的IP...

    java获取客户端ip及mac地址

    ### Java 获取客户端 IP 地址 在 Web 开发中,获取客户端 IP 地址是一项非常重要的功能,尤其是在需要记录用户活动、实现地理位置定位...以上就是关于如何在 Java 中获取客户端 IP 地址及 MAC 地址的相关知识点介绍。

    java常用ip匹配

    本文将围绕“Java常用IP匹配”这一主题,深入探讨IP地址的基本概念、正则表达式在IP匹配中的应用,以及如何利用Java内置库进行IP地址的验证与解析。 ### IP地址基础 IP地址(Internet Protocol Address)是互联网...

    java根据ip获取国家、地区名称,附带ip库

    本篇将详细讲解如何在Java中根据IP地址获取国家和地区信息,并介绍一个附带的IP库。 首先,我们需要明白IP地址与地理位置之间的关联是通过IP库来建立的。IP库通常包含大量的IP段与对应国家、地区的映射关系,以便...

    获取本机主机名和IP地址

    获取本机IP地址的方法取决于操作系统和网络环境。在Windows系统中,可以使用`GetAdaptersAddresses`函数,而在Unix/Linux系统中,可以使用`getifaddrs`函数或执行`ifconfig`命令。 在编程中,我们可以利用各种语言...

    JSP获取客户端IP地址浏览器版本操作系统.pdf

    在使用多级反向代理的情况下,`X-Forwarded-For`的值可能是一串IP值,我们需要取第一个非unknown的有效IP字符串作为客户端的真实IP地址。 获取浏览器版本和操作系统信息 我们可以使用`request.getHeader("User-...

    JAVA取客户端信息

    理解标题:JAVA取客户端信息 此标题表明本程序的主要功能是利用Java编程语言获取客户端的相关信息。 ### 2. 描述解读:JAVA取客户端信息,通过JAVA可以去到客户端的信息 这段描述虽然简单,但其含义是利用Java...

    java中怎么获取客户端的真实的IP

    // 如果逗号存在,则取第一个IP地址 ip = ip.substring(0, index); } } // 如果X-Forwarded-For不存在或者为空,则使用其他方法获取IP if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)...

    java接听UDP广播

    总结,Java UDP广播监听涉及创建`DatagramSocket`、接收数据包、解析数据以及关闭套接字等关键步骤。这个过程对于网络编程来说是基础且重要的,尤其在需要与多个设备进行无需预先建立连接的通信时。通过学习和实践,...

    获取访问者真实的IP地址

    此时取第一个IP地址作为客户端的真实IP地址。 3. **处理 `REMOTE_ADDR`**:如果以上两种方式都无法获取到有效的IP地址,则直接使用`request.getRemoteAddr()`方法获取客户端IP地址。需要注意的是,这种方式获取的...

    取网络IP地址、掩码、网关

    总结来说,理解并获取网络的IP地址、子网掩码和网关对于网络管理、故障排查以及网络编程至关重要。"ConfigParams"这样的程序可以帮助我们快速获取这些信息,简化工作流程。在实际应用中,开发者应当熟悉多种操作系统...

    IP数据及查询

    本文将详细探讨“IP数据及查询”这一主题,包括如何获取客户端真实IP地址,理解纯真IP数据库以及如何利用Java进行IP查询。 首先,我们要明白IP地址是互联网上每个设备的唯一标识,它分为IPv4和IPv6两种类型。在Web...

    Java利用Request请求获取IP地址的方法详解

    总结来说,获取用户IP地址在Java Web开发中是一个关键步骤,涉及到的头部字段包括但不限于`X-Real-IP`、`X-Forwarded-For`等。正确地处理这些头部信息,可以确保即使在复杂的网络环境中也能获取到尽可能准确的客户端...

    详细的java基础总结

    ### 详细的Java基础总结 #### 第一章:Java概述 - **Java的发展史** Java语言由Sun Microsystems公司的James Gosling等人设计,于1995年正式发布。最初被命名为Oak,后改名为Java。Java的发展历程如下: - 1995...

    ARM开发板配置java运行环境成功笔记记录

    请替换`&lt;your_dev_board_ip&gt;`为你的开发板的实际IP地址。 现在,开发板上已经有了JRE,但还需要配置环境变量才能使Java可用。打开终端,或者编辑`.bashrc`或`.profile`文件(取决于你的Shell),添加以下行来设置`...

    利用Java如何获取IP与机器名方法示例

    在Java编程中,获取IP地址和机器名是常见的任务,特别是在网络编程和服务器开发中。以下是如何使用Java来实现这一功能的详细说明。 首先,Java提供了`java.net.InetAddress`类,该类用于表示互联网协议(IP)地址和...

    知乎爬虫最新版java

    代理服务器可以提供多个不同的IP地址,让爬虫在不同IP之间切换,确保爬取任务的顺利进行。 “java”和“爬虫”表明这个项目是用Java语言实现的网络爬虫程序。Java作为一种跨平台的语言,具有丰富的库和框架支持网络...

    获取ip归属地

    `getIPRange`方法用于将IP地址范围转换为单独的IP地址列表,这需要一些额外的逻辑来处理IP地址的转换。最后,`getIPLocation`方法用于根据输入的IP地址返回其归属地。 注意,`getIPRange`方法的具体实现取决于IP...

    jsp页面得到客户端的真是ip

    在 JSP 页面中获取客户端的真实 IP 地址通常需要编写一些 Java 代码片段来处理。以下是一个典型的示例: ```jsp ;charset=gb2312"%&gt; &lt;%@page import="java.util.*"%&gt; String realIP = request.getHeader("x-...

Global site tag (gtag.js) - Google Analytics