端口转发后,如何在Java中获取我的外部IP?

端口转发后,如何在Java中获取我的外部IP?,java,external,ip,Java,External,Ip,我在我的笔记本上设置了一个静态IP并进行了端口转发,现在我有了一个静态IP地址,但它是相对静态的,每次我重新启动机器,我都会得到另一个地址,因为我有一个“静态”IP,我现在可以进行Paypal IPN消息传递。但是如何从Java程序中获得这个静态IP呢?我能想到的一种方法是访问:在那个页面上,它告诉我我的外部IP是什么,所以我可以用Java代码提取它,我可以用Java代码中的其他方法来获取这些信息吗?最好的解决方案可能是。基本上,您在计算机(或路由器)上运行一个程序,当您的IP发生变化时通知DN

我在我的笔记本上设置了一个静态IP并进行了端口转发,现在我有了一个静态IP地址,但它是相对静态的,每次我重新启动机器,我都会得到另一个地址,因为我有一个“静态”IP,我现在可以进行Paypal IPN消息传递。但是如何从Java程序中获得这个静态IP呢?我能想到的一种方法是访问:在那个页面上,它告诉我我的外部IP是什么,所以我可以用Java代码提取它,我可以用Java代码中的其他方法来获取这些信息吗?

最好的解决方案可能是。基本上,您在计算机(或路由器)上运行一个程序,当您的IP发生变化时通知DNS服务器。然后,你可以告诉PayPal域名。

我看到三种方法:

  • 正如您所发现的,查询外部服务器显然是从哪个IP连接的。这很简单,但是您需要这样的服务,并且通常没有透明代理会影响您的结果
  • IGD是UPnP的一个子协议,如果您的端口转发设备支持它,它可以很容易地为您提供结果(许多端口转发设备支持它)。谷歌“IGD JAVA”的图书馆和样本
  • 注册动态DNS服务,然后查找您自己的DNS名称

  • 您可以使用NetworkInterface类:

    Enumeration<NetworkInterface> ifcs = NetworkInterface.getNetworkInterfaces();
    while(ifcs.hasMoreElements()){
      NetworkInterface ifc = ifcs.nextElement();
      System.out.println("Adresses of: "+ifc.getDisplayName());
      Enumeration<InetAddress> adresses = ifc.getInetAddresses();
      while(adresses.hasMoreElements()){
        System.out.println(adresses.nextElement().getHostAddress());
      }
    }
    
    枚举ifcs=NetworkInterface.getNetworkInterfaces(); while(ifcs.hasMoreElements()){ NetworkInterface ifc=ifcs.nextElement(); System.out.println(“地址:“+ifc.getDisplayName()); 枚举地址=ifc.getInetAddresses(); while(address.hasMoreElements()){ System.out.println(address.nextElement().getHostAddress()); } }
    此代码段将向您显示所有接口以及绑定到它们的IP。您需要在列表中查找适当的接口(另请参见NetworkInterface.getByName(字符串名称)),然后查看该接口的地址。找到适当的inetAddress后,您可以使用它来获取字符串或字节表示。

    您可以使用脚本调用公共服务来检索外部IP地址。请记住,他们曾经更改过链接位置。如果您控制自己的服务器,您可能应该编写自己的PHP脚本,只需将调用方的地址返回到脚本

    -遵循他们提供的开发人员链接

    import java.net.*;
    import java.io.*;
    
    URL myExternalIP = new URL("PUT THE LINK HERE");
    BufferedReader in = new BufferedReader(new InputStreamReader(
                    myExternalIP.openStream()));
    
    String ip = in.readLine(); //you get the IP as a String
    System.out.println(ip);
    
    您自己的服务器脚本是一个简单的单行程序。创建一个名为whatismyip.php的文件,下面是内容

    <? echo $_SERVER['REMOTE_ADDR']?>
    
    
    
    如何“注册动态DNS服务”?我是否需要打电话给我的ISP,安装一个程序,它是免费的吗?最简单的说,你只需注册一个动态DNS服务(例如),并使用他们所拥有的任何机制来更新你的真实IP。大多数(如果不是全部的话)服务都提供了一个小工具,您可以运行它来自动用真实IP更新动态DNS名称。DynDNS的服务对最多5个主机名是免费的。@Matt:谢谢,非常有帮助!不过我有点困惑,所以我真的不需要设置静态IP并进行端口转发,只要转到dyndns.com/services/dns/dyndns并注册他们的服务并运行他们的软件,它就会自动将我的动态地址发送到我注册的名称吗?设置静态IP并自己转发它有什么意义?这将返回本地地址,而不是公共地址。