分享

Java 获取手机/平板IP地址的方法

 风雪夜归人_95 2014-06-17
java是通过NetworkInterface来获取本机IP地址的信息。
 
Socket:一台机器的通讯节点称为socket,在java中,socket是java.net包里面的Socket,ServerSocket,DataGramSocket,MultiSocket的实例。

IP地址java中用java.net.InetAddress来表示。
 
InetAddress:ip地址或者域名,指向远程地址。如果域名解析不了,则出错。
抽象类,有两个子类:Inet4Address和Inet6Address。这两个类智能通过InetAddress的静态方法获取,不能直接构造。包可见。

InetSocketAddress extends SocketAddress:ip socket地址,用{ip,port}或者{hostname,port}表示。也能够单独用port构造,表示本机ip地址,所有本机网络地址。

NetwordInterface:本机网络接口,由多个网络接口名称和对应的网络接口的ip地址列表构成。
 
网络主机有两个特殊的网络地址:
loopback:127.0.0.1 用来检测本机的host名称,或者检测本地ip地址是否可用。
wildcard:0.0.0.0 绑定了本机所有的ip地址。
 
for (Enumeration<NetworkInterface> en = NetworkInterface
      .getNetworkInterfaces(); en.hasMoreElements();) {
     NetworkInterface intf = en.nextElement();

     for (Enumeration<InetAddress> enumIpAddr = intf
       .getInetAddresses(); enumIpAddr.hasMoreElements();) {
      InetAddress inetAddress = enumIpAddr.nextElement();

      if (!inetAddress.isLoopbackAddress()) {
       if (inetAddress.isReachable(1000) && InetAddressUtils.isIPv4Address(inetAddress.getHostAddress())) {
        String localIp = inetAddress.getHostAddress()
          .toString();
        byte[] localIpBytes = inetAddress.getAddress();
        app.me.ipAddress = localIp;
        Log.i("msg","自己ip="+localIp);
        System.arraycopy(localIpBytes, 0, regBuffer,
          44, 4);
       }
      }
     }
    }
 
可以看到上面的代码,是获取手机ip的核心代码。由两个for循环组成。首先第一个for循环是在所有和本机绑定的网络接口中进行遍历。(Enumeration是一个接口,它生成一个一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。它含有两个方法:
hasMoreElements() 测试此枚举是否包含更多的元素;nextElement() 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。)第二个for循环则是在与每一个网络接口绑定的ip地址中进行遍历。如果在1秒中内不能建立这个连接,则认为该连接不可行。
    但是有时候会出现fe80::aef7:f3ff:fe8c:5da4%wlan0这样的IP地址。这是IPV6的地址。但是我们需要的是IPV4的地址,故需要加上一个判断,即代码中的蓝色部分。蓝色部分实际上就是判断当前的IP是否是IPV4的地址。如果没有这句话,那么IPV6的地址在后面会被默认当做IPV4来处理,所以会出现问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多