【问题标题】:Get host ip android获取主机ip安卓
【发布时间】:2013-04-26 03:24:44
【问题描述】:

试图做我的作业,但想不通。

我正在制作一个可以在手机上运行的应用,该手机可以 24/7 全天候保持连接到我的家庭 wifi。我希望它检测主机 ip 并跟踪任何更改,但我无法让代码正常工作。我找到了 InetAddress 类,这似乎是我需要的,但是下面的代码抛出了一个通用异常“有什么不好的地方出错了”,我不知道如何确定它,因为它不是该方法抛出的 UnknownHostException文档:

public void getIP(View view) {
    isNetOK();
    getLocalIpAddress();

}

public void isNetOK() {
    //get connectivity manager
            connMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            //call getActiveNetworkInfo method of connMan, returns a networkInfo object
            NetworkInfo netInfo = connMan.getActiveNetworkInfo();
            if (netInfo !=null && netInfo.isConnected()) {
                setViewText("net_stat", "Network Connected"); 
                netOK = true;
            } else {
                setViewText("net_stat", "Network Unavailable");
            }
}

public void getLocalIpAddress() {
     isNetOK();
     if (netOK) {

         try{

          InetAddress ownIP = InetAddress.getLocalHost();
          localIP = ownIP.toString();
          }catch (UnknownHostException e){
          setViewText("ip_view", "Error: unknown host");
          } catch (Exception ex) {
              setViewText("ip_view", "Something bad is going wrong");
          }

     }

isNetOK 工作得很好,我已经单独调用了一天左右。

有人能指出为什么这段代码不起作用吗? 这是最好的方法吗?我的目标是将家中的服务器与我在 GoDaddy 获得的域名相关联。我的 IP 地址是动态的,但每隔几个月或断电时才会更改。我想要一个可以不时检查 ip 的应用程序(6 小时?),如果它发生变化,请通知我,以便我可以更新 DNS。我知道,hacky 和慢等等,但它真的只是供私人使用,看看我是否可以让它工作。

编辑 1

我在下面 budcopter 的回答中尝试了该方法,最后得到了一些代码并进行了一些更改:

    public void getLocalIpAddress() {
     if (netOK) {
         try{
             WifiManager WiMan = (WifiManager) getSystemService(Context.WIFI_SERVICE);
             WifiInfo wifiInfo = WiMan.getConnectionInfo();
             int address = wifiInfo.getIpAddress();
             String ipAddress = (String) Integer.toString(address);
             setViewText("ip_view", ipAddress);
          } /*catch (UnknownHostException e){
              setViewText("ip_view", "Error: unknown host");
          } */catch (Exception ex) {
              setViewText("ip_view", "Something bad is going wrong");
          }
     }

这将返回一个有效的 int,长度为 10 位。但是,当我对照 whatismyip.com 进行检查时,它们甚至不一样。手机的 LAN 地址是 192.168.1.110,我们的外部 ip 是 75.xx.xx.xxx,返回的 int 是 1812048064。即使我重启 WiFi 无线电,也会返回相同的数字。知道 WifiManager 系统服务给我的号码是多少吗?

另外,如果 WiFi 被禁用,我将添加一个检查以防止请求地址,但目前这是微不足道的。

【问题讨论】:

  • 这无论如何也解决不了你的问题,因为手机不知道路由器的外部 IP地址,而且不知道就知道路由器或外面的东西。基本上,您将需要访问这些 IP 查找器站点之一的程序等效项。您可能会发现在路由器本身上运行自定义服务更容易。
  • 谢谢克里斯·斯特拉顿。知道代码返回了什么吗?我会研究其他选项,我尝试通过路由器将手机设置为 DMZ,没有变化。我明白你在说什么,我将开始通过其中一个网站寻找程序化工具,我不知道如何让我的程序与简单的消费者 wifi 路由器设备交互。
  • DMZ 不会改变任何东西,因为手机仍在通过本地网络获取流量。我实际上建议更多地将发布-IP-更新守护程序放在路由器上而不是电话上。如果路由器或电缆调制解调器有一个状态网页,您可能会用手机刮掉它并寻找它从上游 DHCP 服务器接收到的外部信息。当然,如果您在运营商 NAT 之后,即使那也不是外部可见的地址。

标签: java android ip-address


【解决方案1】:

试试这个:

 public void getLocalIpAddress() {
 // remove it, duplicated call
 // isNetOK();
 if (netOK) {

     try{
         WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
         int address = info.getIpAddress();

         String ipAddress = Formatter.formatIpAddress(address);
         setViewText("ip_view", ipAddress);
      } catch (UnknownHostException e){
          setViewText("ip_view", "Error: unknown host");
      } catch (Exception ex) {
          setViewText("ip_view", "Something bad is going wrong");
      }

 }

别忘了你的 androidmainfest.xml 中的 userpermisson:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

【讨论】:

  • 当然,我在我的项目中做到了。以下是源代码:code.google.com/p/wifi-scanner/source/browse/src/com/…
  • 我在使用这种方法时遇到了问题。我找不到类 mWifiManager(在 eclipse 中或文档中),但我可以找到 WifiManager。当我尝试“WifiInfo wifiInfo = WifiManager.getConnectionInfo();”它告诉我我不能对非静态方法 getConnectionInfo() 进行静态引用。
  • 另外,Formatter.formatIpAddress 已被弃用,因此我删除了该行。我只是将 ip 存储为一个 int,这很好,也许更容易,用于比较随时间变化的存储值。
  • 不管这个“行得通”还是找不到本地IP地址,都不是需要发现才能解决实际需要的。
  • 我已经完全改变了我的方法,所以只是对这个问题的最后一个观察。上面来自 buptcoder 的代码返回一个数字,但它既不是手机的内部 ip,也不是路由器的公共 ip,它只是一个十位整数。我不太确定它是什么。
猜你喜欢
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
相关资源
最近更新 更多