2010-10-07 136 views
0

如何使用Java获得我的计算机的广域网? 我尝试用这样的:如何在Java中获取计算机的WAN IP地址?

ServerSocket ss = new ServerSocket(port); 
System.out.println(ss.getInetAddress().getHostAddress()); 
//wich return 0.0.0.0 

然后我尝试用这样的:

System.out.println(InetAddress.getLocalHost().toString()); 
//which return keenan-a658368c/192.168.1.100 < yes it is connected to router 

的功能等说,这回我的本地IP地址

我如何获得广域网IP地址?如118.137.43.219

+3

那么,如果您连接到路由器,您的计算机没有WAN IP地址。您可以向http://www.whatismyip.com/automation/n09230945.asp发出HTTP请求,它会返回您的互联网连接(调制解调器)分配的IP地址。 – Strelok 2010-10-07 14:02:48

+0

哦,我明白了,所以我只能依靠外部服务器来知道我的IP。我可以使用我自己的WebServer(我有一个Apache Web服务器运行)或者也许另一个Java程序的PHP脚本(或ASP)? – 2010-10-07 14:27:42

+1

是的你可以:echo $ _SERVER ['REMOTE_ADDR']; – Milan 2010-10-07 14:37:04

回答

2

你可以从http://whatismyip.com/automation/n09230945.asp得到它。你可以打开一个HttpURLConnection到这个站点并解析输出。

这个计划应该是有帮助的:

import java.net.HttpURLConnection; 

public class GetExternalIp { 

    public static void main(String args[]) { 
     try { 

      java.net.URL url = new java.net.URL(
        "http://whatismyip.com/automation/n09230945.asp"); 

      java.net.HttpURLConnection con = (HttpURLConnection) url 
        .openConnection(); 

      java.io.InputStream stream = con.getInputStream(); 

      java.io.InputStreamReader reader = new java.io.InputStreamReader(
        stream); 

      java.io.BufferedReader bReader = new java.io.BufferedReader(reader); 

      System.out.print("Your IP address is " + bReader.readLine()); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 

从引用:

http://www.daniweb.com/forums/thread192872.html

http://www.coderanch.com/t/411356/java/java/Public-IP-Address-time-limit

1

正如评论中所述,如果您在执行NAT的路由器的后面,则您的计算机将不知道其WAN地址。

更复杂的情况是您位于NAT池的后面。如果这是真的,那么您的广域网地址可能会定期更改,可能每天更新一次或更多。

或者某些类型的流量可能会被强制通过代理。这可能会使出站HTTP请求来自不同于WAN或其他任意协议的WAN地址。

0

一般取决于这样做有一个设计缺陷的任何代码 - 你能详细说明为什么你需要获得NAT路由器的出口IP地址?

出口IP地址不会帮助您创建回连接,因为路由器通常不会将其转发给适当的内部主机。

+0

它只是为用户,所以它会看起来像:使端口5555上的xxx.xx.xxx.xxx服务器,然后你现在可以访问该服务器(或ServerSocket对象)在那个ip – 2010-10-08 08:29:08

2

如果您最终使用的远程服务使用“外部IP地址”进行回复(请参阅其他答案以了解可能的定义),请勿使用其中一种免费的无名称服务。部署你自己的。您不得构建依赖某人的应用程序,这些应用程序可能会在任何时候离开,而无需通知您或任何其他不幸的用户。

+0

okaay,然后我将租用一个免费的虚拟主机,然后放置php脚本:D – 2010-10-08 08:27:31

+0

免费托管服务与上面提到的无名称外部托管PHP脚本差不多。我的观点是,不要开发任何依赖资源的关键业务流程,而这些资源可能会不再需要注意。 – 2010-10-09 17:48:35

0

要得到计算机的主接口的IP地址:

InetAddress.getLocalHost().getHostAddress() 

要获得所有接口的IP地址:

List<InetAddress> addresses = new LinkedList<InetAddress>(); 
Enumeration<NetworkInterface> ifcs = NetworkInterface.getNetworkInterfaces(); 
while (ifcs.hasMoreElements()) { 
    NetworkInterface ifc = ifcs.nextElement(); 
    for (InterfaceAddress ifcAddr : ifc.getInterfaceAddresses()) { 
     addresses.add(ifcAddr.getAddress()); 
    } 
} 

要获取IP地址,互联网上的其他机器就看到你计算机的连接来自YoK的答案。

相关问题