【问题标题】:External IP Address of the client客户端的外部 IP 地址
【发布时间】:2011-10-25 19:02:11
【问题描述】:

听起来很有趣,但是如何从客户端获取外部 IP 地址?

我尝试了一些东西,但没有为我工作。

首先我尝试过

request.getRemoteAddr()

我得到的结果是:0:0:0:0:0:0:0:1

第二个我试过了

InetAddress ip = InetAddress.getLocalHost();
ip.getHostAddress());

我得到的结果是:127.0.0.1

我尝试了第三名

        URL whatismyip = new URL("http://checkip.dyndns.org:8245/");
        BufferedReader inIP = new BufferedReader(new InputStreamReader(whatismyip.openStream()));

        String IPStrOld = inIP.readLine(); //IP as a String
        String IPStrNewest = IPStrOld.replace("<html><head><title>Current IP Check</title></head><body>Current IP Address: ", "");
        String IPStr = IPStrNewest.replace("</body></html>", "");

但我只获取服务器的外部 IP

最后一位

        URL whatismyip = new URL("http://automation.whatismyip.com/n09230945.asp");
        BufferedReader inIP = new BufferedReader(new InputStreamReader(whatismyip.openStream()));
        String ip = inIP.readLine();

这个也一样,我只获取服务器的外网IP

那么,交易是什么?

【问题讨论】:

  • “客户端的外部 IP 地址”究竟是什么意思?你能举一些具体的例子吗?例如,如果客户端通过局域网访问服务器怎么办?如果这不是一个有效的场景,那应该在问题中解释。通过具体的例子,我的意思是你应该详细说明客户端的位置(即哪种类型的网络),它如何到达服务器,哪些 IP 地址在起作用,以及你试图获取哪个 IP 地址。
  • 路由器的IP地址,希望你现在明白了吧? “客户所在的位置” - 这就是我想知道的:) + 客户的 IP 即:103.456.768.22
  • @hoss 好的,那么当客户端向您发出请求时,将发生地址转换(NAT 或代理服务器),您的服务器将接受用户的远程连接。此连接应为您提供客户端的翻译地址。因此,我认为 jzd 的答案是正确的,还有一个额外的问题需要解决。您的“请求”对象的类型是什么?
  • 好的,这里是HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);

标签: java ip-address external


【解决方案1】:

代码:

    URL whatismyip = new URL("http://checkip.dyndns.org:8245/");
    BufferedReader inIP = new BufferedReader(new InputStreamReader(whatismyip.openStream()));
    String IPStrOld = inIP.readLine(); //IP as a String
    String IPStrNewest = IPStrOld.replace("<html><head><title>Current IP Check</title></head><body>Current IP Address: ", "");
    String IPStr = IPStrNewest.replace("</body></html>", "");

对我来说很好用!我得到了我的路由器IP地址! (在类似 XXX.XXX.XXX.XXX 的字符串中)

网站代码:

http://automation.whatismyip.com/n09230945.asp

现在不行了……

【讨论】:

    【解决方案2】:

    对服务器上运行的代码运行“whatismyip”操作只会为您提供服务器地址。

    还有,

    http://www.rgagnon.com/javadetails/java-0363.html

    从那个链接:

    <%
    out.print( request.getRemoteAddr() );
    out.print( request.getRemoteHost() );
    %>
    

    如果客户端在代理后面,您可能无法获得真实的客户端 IP,您将获得代理的 IP 而不是客户端。但是,代理可能会在特殊的 HTTP 标头中包含请求客户端 IP。

    <%
    out.print( request.getHeader("x-forwarded-for") );
    %>
    

    【讨论】:

    • request.getRemoteAddr() 始终将 IP 作为 localhost (127.0.0.1) 获取,即使这是服务器或客户端
    • ?这与您在问题中所说的不符。
    • 也许吧,但 0:0:0:0:0:0:0:1 也是无效 IP :)
    • @hoss jzd 的答案是正确的。现在,如果您没有从用户请求创建的连接中获得有效的 IP 地址,那么您的问题来自其他地方。如果您使用的是套接字,您应该能够检索该信息,尤其是当您的客户端从您的服务器接收答案时。
    【解决方案3】:

    如果您的客户端使用NAT(网络地址转换),它可能没有外部地址。大多数情况下,根据我的经验,情况就是这样。在工作中,我的网络请求通过代理,所以网络服务器只能确定这个地址。在家里,我通过服务器使用 NAT,所以我正在输入的这台笔记本电脑没有外部地址。最接近的是从我的服务器地址“whatismyip”返回的内容,有时我可以通过它转发到我的笔记本电脑的端口。

    【讨论】:

    • 最终,没有解决方案?在我的应用程序中,我需要检查客户来自哪个国家和/或他/她从哪个 IP 下订单
    • 我不这么认为。我在澳大利亚,工作代理在新加坡……对本地化网站有很大帮助:(
    • 不,这个答案不正确。如果用户通过 NAT 访问网络,NAT 将为所有连接分配一个临时公共 IP 地址和端口。否则,互联网将无法正常工作。这个地址不是永久的,但确实存在。
    • 不@JVerstry,你错了。当数据包从内部网络传递到外部网络时,路由器会重写数据包,反之亦然。没有临时地址。阅读我提供的链接。
    • 我同意,但这不是我的意思。从 hoos 的角度来看,无论该地址是由 NAT 还是代理服务器转换的,都会创建此地址并且应该对他可见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2011-10-22
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多