获取运行我的应用程序的Android设备的IP的最可靠方法是什么?不是公共知识产权

时间:2018-06-05 18:10:10

标签: android chromebook

我的应用程序有一个用户可以从家庭局域网访问的Web服务器。目前我有两种获取设备IP的方法,我不知道哪种方式更可能是正确的。

我的正常方式:

  List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface intf : interfaces) {
            List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
            for (InetAddress addr : addrs) {
                if (!addr.isLoopbackAddress()) {
                    String sAddr = addr.getHostAddress().toUpperCase();

我的替代方式:

        WifiInfo connectionInfo = wifiMgr.getConnectionInfo();
        int ip = connectionInfo.getIpAddress();

我觉得这个问题一直很好但我确实有一些统计数据,看起来两个ips只有4%的时间不同。

此外,我刚刚在Chromebook上尝试了我的应用,其他方式实际上是正确的,而不是正常的方式。

那么我怎么知道哪种方式更好还是有更好的选择呢?

5 个答案:

答案 0 :(得分:0)

它们非常不可靠,因为你必须处理很多边缘情况。

我更喜欢使用免费的外部服务;进行网络通话并获得适当的公众面向IP。试试https://www.ipify.org/

答案 1 :(得分:0)

扫描NetworkInterfaces当然可以返回各种结果。您可以从intf.getName()了解更多内容,例如:

  • wlan0
  • 上的无线连接
  • rmnet1
  • 等3G / 4G连接
  • lo上的环回(127.0.0.1) - 您已经取消了此
  • 有线以太网连接eth0 - 某些Chromebook可能

还有更多可能性,如VPN连接。

如果可以肯定地说您只想在Wifi连接上连接到Web服务器,则可以添加一个检查,界面名称以wlan开头,但是对于这种情况,你的替代解决方案似乎更简单。

如果Chromebook上也可以使用以太网连接,则网络服务器可能会在wlan0eth0上提供连接。从网络接口中选择首选连接,或者甚至准备提供无线和有线IP。

答案 2 :(得分:0)

我正在使用以下方式从Android设备获取本地IP地址,这对我来说很好看:

public static String getLocalIpAddress() {
    try {
        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() && inetAddress instanceof Inet4Address) {
                    return inetAddress.getHostAddress();
                }
            }
        }
    } catch (SocketException ex) {
        ex.printStackTrace();
    }
    return null;
} 

这与您的常规方式几乎相同,但有点精致。希望这会有所帮助!

答案 3 :(得分:0)

我建议你将IP内容移动到服务器/后端部分。它更可靠,通常更容易(你不必处理android API&#39; s)来确定服务器上的这种东西,因为大多数连接属性都以头字段的形式传递给你。

您可以在以下标题中查找客户端IP(这取决于您的服务器设置,但在大多数情况下,这就足够了):

  • &#34; X - 转发,对于&#34;,
  • &#34;代理客户端IP&#34; (如果服务器位于代理服务器后面)
  • &#34; WL-代理客户端IP&#34;,
  • &#34; HTTP_X_FORWARDED_FOR&#34;,
  • &#34; HTTP_X_FORWARDED&#34;,
  • &#34; HTTP_X_CLUSTER_CLIENT_IP&#34;,
  • &#34; HTTP_CLIENT_IP&#34;,
  • &#34; HTTP_FORWARDED_FOR&#34;,
  • &#34; HTTP_FORWARDED&#34;,
  • &#34; HTTP_VIA&#34;,
  • &#34; REMOTE_ADDR&#34;

由于您说某些标题中仅从本地网络访问您的服务器,因此您只能获得本地IP

答案 4 :(得分:-1)

在公共互联网上建立TCP连接,然后检查该套接字的源IP。

/ JB