Part 1 Java获取公网IP
在Java中获取公网IP地址(即外部IP地址,而非局域网地址)通常需要借助外部服务,因为Java本身没有直接获取公网IP地址的API。你可以通过向一个外部服务发送HTTP请求,然后解析其返回的响应来获取公网IP地址。
以下是一个示例代码,展示了如何通过调用一个外部API来获取公网IP地址:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class PublicIPAddress {
public static void main(String[] args) {
try {
// 使用一个公共的API来获取公网IP地址,比如 ifconfig.me 或者 ipecho.net
String urlString = "http://ifconfig.me"; // 或者 "http://ipecho.net/plain"
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
// 读取响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// 打印公网IP地址
String publicIPAddress = response.toString().trim();
System.out.println("Public IP Address: " + publicIPAddress);
} catch (Exception e) {
e.printStackTrace();
}
}
}
解释
- URL :
http://ifconfig.me
和http://ipecho.net/plain
是两个常用的公共API,它们会返回你当前的公网IP地址。 - HttpURLConnection: 用于发送HTTP GET请求到指定的URL。
- BufferedReader: 用于读取HTTP响应的内容。
- StringBuilder: 用于构建最终的响应字符串。
注意事项
- 外部服务可靠性: 确保你选择的API服务是可靠的,并且不会因为频繁访问而被限制或封禁。
- 网络延迟: 调用外部服务可能会有一定的网络延迟,尤其是在网络状况不佳的情况下。
- 隐私: 调用这些服务意味着你的公网IP地址会被这些服务的提供者知道。
通过这种方式,你可以获取到当前机器的公网IP地址,而不仅仅是局域网地址。
可以使用如下网址验证
Part 2,Java获取IP
获取调用方的公网IP地址在Java环境中通常涉及解析HTTP请求的头信息。以下是一些常用的方法和步骤来获取调用方的公网IP地址:
方法一:通过HttpServletRequest对象获取
在Java Web环境中,HttpServletRequest
对象包含了客户端请求的所有信息,包括IP地址。你可以使用以下步骤来获取公网IP:
-
检查代理头信息 :如果请求是通过代理服务器或负载均衡器发送的,
X-Forwarded-For
头信息通常会包含真实的客户端IP地址。首先检查这个头信息是否存在并且不为空。 -
使用备用头信息 :如果
X-Forwarded-For
头信息不存在或为空,你可以尝试检查其他可能的头信息,如Proxy-Client-IP
或WL-Proxy-Client-IP
(WebLogic Server特有的头信息)。 -
获取直接连接的IP地址 :如果上述头信息都不存在,你可以使用
HttpServletRequest
的getRemoteAddr()
方法获取直接连接到服务器的客户端IP地址。但请注意,这个方法在存在代理的情况下可能会返回代理服务器的IP地址。 -
处理多个IP地址 :如果
X-Forwarded-For
头信息包含多个IP地址(由逗号分隔),通常第一个IP地址是真实的客户端IP地址。
方法二:示例代码
以下是一个Java代码示例,展示了如何获取调用方的公网IP地址:
import javax.servlet.http.HttpServletRequest;
public class IpUtil {
public static String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 如果有多个IP地址,则取第一个(通常是用户真实IP)
if (ip != null && ip.contains(",")) {
ip = ip.split(",")[0];
}
return ip;
}
}
然后,你可以在一个Servlet中使用这个工具类来获取并处理调用方的IP地址:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class IpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String clientIp = IpUtil.getClientIp(request);
response.getWriter().write("Client IP: " + clientIp);
}
}
注意事项
- 安全性:确保你的应用能够正确处理代理头信息,以防止IP伪造攻击。
- 隐私:获取并存储用户IP地址可能涉及隐私问题,确保你的应用符合相关的隐私政策和法规。
- 日志记录:将获取到的IP地址记录在日志中可以帮助你进行安全监控和故障排查。
通过以上方法和注意事项,你可以有效地在Java Web环境中获取调用方的公网IP地址。
Part 3,局域网IP vs 公网IP
局域网IP(Local Area Network IP)与公网IP(Public Network IP)在计算机网络中扮演着不同的角色,它们之间存在显著的差异。以下是对这两种IP地址的详细比较:
一、定义与范围
- 局域网IP :
- 局域网IP是在局域网(LAN)内部使用的IP地址。
- 它用于在局域网内部标识和通信局域网内的设备。
- 常见的局域网IP地址范围包括RFC 1918规定的三类地址:10.0.0.0 - 10.255.255.255、172.16.0.0 - 172.31.255.255、192.168.0.0 - 192.168.255.255。
- 公网IP :
- 公网IP也称为外网IP,是由互联网服务提供商(ISP)分配的,用于在互联网上唯一标识一台设备的IP地址。
- 公网IP地址是全球唯一的,由IANA(互联网号码分配机构)分配,并通过ISP提供给用户。
- 常见的公网IP地址范围包括除局域网IP地址范围之外的所有地址。
二、功能与用途
- 局域网IP :
- 主要用于局域网内部设备之间的通信。
- 设备通过局域网IP地址在局域网内部相互访问和传输数据。
- 局域网IP地址不能直接访问互联网,需要通过路由器或网关进行NAT(网络地址转换)才能访问外部网络。
- 公网IP :
- 用于设备在互联网上进行通信和访问。
- 拥有公网IP地址的设备可以直接访问互联网上的其他设备和服务。
- 公网IP地址适用于需要被外界访问的服务,如Web服务器、邮件服务器等。
三、安全性与隐私
- 局域网IP :
- 由于局域网IP地址仅在局域网内部使用,因此相对较为安全。
- 但如果局域网内部存在安全漏洞或不当配置,也可能导致局域网内的设备受到攻击。
- 公网IP :
- 公网IP地址直接暴露在互联网上,因此需要考虑网络安全性。
- 需要采取适当的防火墙和安全措施来保护拥有公网IP地址的设备不受未经授权的访问和攻击。
四、获取与配置
- 局域网IP :
- 局域网IP地址通常由路由器或交换机在设备连接到局域网时自动分配(如通过DHCP协议)。
- 用户也可以手动配置局域网IP地址,但需要注意避免地址冲突。
- 公网IP :
- 公网IP地址由ISP分配,用户需要向ISP申请才能获得。
- 对于需要固定公网IP地址的服务,用户需要与ISP协商并支付额外的费用。
- 用户还可以通过动态DNS(DDNS)服务将动态变化的公网IP地址映射到一个易记的域名上,以便更方便地访问和管理服务。
综上所述,局域网IP与公网IP在定义、范围、功能、用途、安全性以及获取与配置等方面都存在显著的差异。了解这些差异有助于用户更好地管理网络设备和配置网络服务。
Part 4,判断是否是局域网域名
117.131.6.170是一个公网IP地址。判断一个IP地址是局域网IP还是公网IP,主要依据其地址范围和功能用途。
首先,局域网IP地址通常用于内部网络通信,如家庭网络、公司内网等,它们不直接连接到互联网。常见的局域网IP地址范围包括10.x.x.x、172.16.x.x至172.31.x.x以及192.168.x.x等。这些地址在局域网内部是唯一的,但在互联网上不是唯一的,因此不能用于互联网通信。
而公网IP地址是由互联网服务提供商(ISP)分配的,用于在互联网上唯一标识一台设备。这些地址是全球唯一的,可以被互联网上的任何设备访问。
对于117.131.6.170这个IP地址,它不在任何局域网IP地址范围内,因此可以判断它是一个公网IP地址。这个地址可以被互联网上的其他设备访问和通信。
综上所述,117.131.6.170是一个公网IP地址,而不是局域网IP地址。