通常绑定本机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地址主要依赖于网络请求和第三方服务的配合。`ExternalIpAddressFetcher.java` 类提供了一个简单的方法来实现这个功能,通过向Amazon AWS提供的公共IP检查服务发起HTTP请求,并解析返回的IP...
### Java 获取客户端 IP 地址 在 Web 开发中,获取客户端 IP 地址是一项非常重要的功能,尤其是在需要记录用户活动、实现地理位置定位...以上就是关于如何在 Java 中获取客户端 IP 地址及 MAC 地址的相关知识点介绍。
本文将围绕“Java常用IP匹配”这一主题,深入探讨IP地址的基本概念、正则表达式在IP匹配中的应用,以及如何利用Java内置库进行IP地址的验证与解析。 ### IP地址基础 IP地址(Internet Protocol Address)是互联网...
本篇将详细讲解如何在Java中根据IP地址获取国家和地区信息,并介绍一个附带的IP库。 首先,我们需要明白IP地址与地理位置之间的关联是通过IP库来建立的。IP库通常包含大量的IP段与对应国家、地区的映射关系,以便...
获取本机IP地址的方法取决于操作系统和网络环境。在Windows系统中,可以使用`GetAdaptersAddresses`函数,而在Unix/Linux系统中,可以使用`getifaddrs`函数或执行`ifconfig`命令。 在编程中,我们可以利用各种语言...
在使用多级反向代理的情况下,`X-Forwarded-For`的值可能是一串IP值,我们需要取第一个非unknown的有效IP字符串作为客户端的真实IP地址。 获取浏览器版本和操作系统信息 我们可以使用`request.getHeader("User-...
理解标题:JAVA取客户端信息 此标题表明本程序的主要功能是利用Java编程语言获取客户端的相关信息。 ### 2. 描述解读:JAVA取客户端信息,通过JAVA可以去到客户端的信息 这段描述虽然简单,但其含义是利用Java...
// 如果逗号存在,则取第一个IP地址 ip = ip.substring(0, index); } } // 如果X-Forwarded-For不存在或者为空,则使用其他方法获取IP if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)...
总结,Java UDP广播监听涉及创建`DatagramSocket`、接收数据包、解析数据以及关闭套接字等关键步骤。这个过程对于网络编程来说是基础且重要的,尤其在需要与多个设备进行无需预先建立连接的通信时。通过学习和实践,...
此时取第一个IP地址作为客户端的真实IP地址。 3. **处理 `REMOTE_ADDR`**:如果以上两种方式都无法获取到有效的IP地址,则直接使用`request.getRemoteAddr()`方法获取客户端IP地址。需要注意的是,这种方式获取的...
总结来说,理解并获取网络的IP地址、子网掩码和网关对于网络管理、故障排查以及网络编程至关重要。"ConfigParams"这样的程序可以帮助我们快速获取这些信息,简化工作流程。在实际应用中,开发者应当熟悉多种操作系统...
本文将详细探讨“IP数据及查询”这一主题,包括如何获取客户端真实IP地址,理解纯真IP数据库以及如何利用Java进行IP查询。 首先,我们要明白IP地址是互联网上每个设备的唯一标识,它分为IPv4和IPv6两种类型。在Web...
总结来说,获取用户IP地址在Java Web开发中是一个关键步骤,涉及到的头部字段包括但不限于`X-Real-IP`、`X-Forwarded-For`等。正确地处理这些头部信息,可以确保即使在复杂的网络环境中也能获取到尽可能准确的客户端...
### 详细的Java基础总结 #### 第一章:Java概述 - **Java的发展史** Java语言由Sun Microsystems公司的James Gosling等人设计,于1995年正式发布。最初被命名为Oak,后改名为Java。Java的发展历程如下: - 1995...
请替换`<your_dev_board_ip>`为你的开发板的实际IP地址。 现在,开发板上已经有了JRE,但还需要配置环境变量才能使Java可用。打开终端,或者编辑`.bashrc`或`.profile`文件(取决于你的Shell),添加以下行来设置`...
在Java编程中,获取IP地址和机器名是常见的任务,特别是在网络编程和服务器开发中。以下是如何使用Java来实现这一功能的详细说明。 首先,Java提供了`java.net.InetAddress`类,该类用于表示互联网协议(IP)地址和...
代理服务器可以提供多个不同的IP地址,让爬虫在不同IP之间切换,确保爬取任务的顺利进行。 “java”和“爬虫”表明这个项目是用Java语言实现的网络爬虫程序。Java作为一种跨平台的语言,具有丰富的库和框架支持网络...
`getIPRange`方法用于将IP地址范围转换为单独的IP地址列表,这需要一些额外的逻辑来处理IP地址的转换。最后,`getIPLocation`方法用于根据输入的IP地址返回其归属地。 注意,`getIPRange`方法的具体实现取决于IP...
在 JSP 页面中获取客户端的真实 IP 地址通常需要编写一些 Java 代码片段来处理。以下是一个典型的示例: ```jsp ;charset=gb2312"%> <%@page import="java.util.*"%> String realIP = request.getHeader("x-...