公网IP and 局域网IP

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();  
        }  
    }  
}

解释

  1. URL : http://ifconfig.mehttp://ipecho.net/plain 是两个常用的公共API,它们会返回你当前的公网IP地址。
  2. HttpURLConnection: 用于发送HTTP GET请求到指定的URL。
  3. BufferedReader: 用于读取HTTP响应的内容。
  4. StringBuilder: 用于构建最终的响应字符串。

注意事项

  • 外部服务可靠性: 确保你选择的API服务是可靠的,并且不会因为频繁访问而被限制或封禁。
  • 网络延迟: 调用外部服务可能会有一定的网络延迟,尤其是在网络状况不佳的情况下。
  • 隐私: 调用这些服务意味着你的公网IP地址会被这些服务的提供者知道。

通过这种方式,你可以获取到当前机器的公网IP地址,而不仅仅是局域网地址。

可以使用如下网址验证

Trusted IP Data Provider, from IPv6 to IPv4 - IPinfo.io

Part 2,Java获取IP

获取调用方的公网IP地址在Java环境中通常涉及解析HTTP请求的头信息。以下是一些常用的方法和步骤来获取调用方的公网IP地址:

方法一:通过HttpServletRequest对象获取

在Java Web环境中,HttpServletRequest对象包含了客户端请求的所有信息,包括IP地址。你可以使用以下步骤来获取公网IP:

  1. 检查代理头信息 :如果请求是通过代理服务器或负载均衡器发送的,X-Forwarded-For头信息通常会包含真实的客户端IP地址。首先检查这个头信息是否存在并且不为空。

  2. 使用备用头信息 :如果X-Forwarded-For头信息不存在或为空,你可以尝试检查其他可能的头信息,如Proxy-Client-IPWL-Proxy-Client-IP(WebLogic Server特有的头信息)。

  3. 获取直接连接的IP地址 :如果上述头信息都不存在,你可以使用HttpServletRequestgetRemoteAddr()方法获取直接连接到服务器的客户端IP地址。但请注意,这个方法在存在代理的情况下可能会返回代理服务器的IP地址。

  4. 处理多个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地址的详细比较:

一、定义与范围

  1. 局域网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。
  2. 公网IP
    • 公网IP也称为外网IP,是由互联网服务提供商(ISP)分配的,用于在互联网上唯一标识一台设备的IP地址。
    • 公网IP地址是全球唯一的,由IANA(互联网号码分配机构)分配,并通过ISP提供给用户。
    • 常见的公网IP地址范围包括除局域网IP地址范围之外的所有地址。

二、功能与用途

  1. 局域网IP
    • 主要用于局域网内部设备之间的通信。
    • 设备通过局域网IP地址在局域网内部相互访问和传输数据。
    • 局域网IP地址不能直接访问互联网,需要通过路由器或网关进行NAT(网络地址转换)才能访问外部网络。
  2. 公网IP
    • 用于设备在互联网上进行通信和访问。
    • 拥有公网IP地址的设备可以直接访问互联网上的其他设备和服务。
    • 公网IP地址适用于需要被外界访问的服务,如Web服务器、邮件服务器等。

三、安全性与隐私

  1. 局域网IP
    • 由于局域网IP地址仅在局域网内部使用,因此相对较为安全。
    • 但如果局域网内部存在安全漏洞或不当配置,也可能导致局域网内的设备受到攻击。
  2. 公网IP
    • 公网IP地址直接暴露在互联网上,因此需要考虑网络安全性。
    • 需要采取适当的防火墙和安全措施来保护拥有公网IP地址的设备不受未经授权的访问和攻击。

四、获取与配置

  1. 局域网IP
    • 局域网IP地址通常由路由器或交换机在设备连接到局域网时自动分配(如通过DHCP协议)。
    • 用户也可以手动配置局域网IP地址,但需要注意避免地址冲突。
  2. 公网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地址。

相关推荐
速盾cdn3 小时前
速盾:CDN是否支持屏蔽IP?
网络·网络协议·tcp/ip
yaoxin5211233 小时前
第二十七章 TCP 客户端 服务器通信 - 连接管理
服务器·网络·tcp/ip
内核程序员kevin3 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
PersistJiao5 小时前
Spark 分布式计算中网络传输和序列化的关系(一)
大数据·网络·spark
冰帝海岸5 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象5 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了6 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端