【问题标题】:Android Broadcast AddressAndroid广播地址
【发布时间】:2011-02-28 22:46:05
【问题描述】:

我正在为我的Android 手机制作客户端服务器应用程序。

我在Python 中创建了一个UDP 服务器,用于监听连接。

我可以将服务器IP 地址直接放入192.169.0.100 中,它可以正常发送数据。我也可以输入192.168.0.255,它会在192.169.0.100上找到服务器。

是否可以获取我的 Android 手机所连接网络的广播地址?我只会在我的 Wifi 网络或其他 Wifi 网络上使用此应用程序。

干杯

【问题讨论】:

    标签: java android udp broadcast android-networking


    【解决方案1】:

    来自

    http://code.google.com/p/boxeeremote/source/browse/trunk/Boxee+Remote/src/com/andrewchatham/Discoverer.java?spec=svn28&r=28

    private InetAddress getBroadcastAddress() throws IOException {
        WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        DhcpInfo dhcp = wifi.getDhcpInfo();
        // handle null somehow
    
        int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
        byte[] quads = new byte[4];
        for (int k = 0; k < 4; k++)
          quads[k] = (byte) (broadcast >> (k * 8));
        return InetAddress.getByAddress(quads);
    }
    

    这样的好处是只看WIFI。我知道 OP 说“我只会在我的 Wifi 网络或其他 Wifi 网络上使用这个应用程序。”但值得一提的是,以防其他人需要非 wifi 替代方案。

    【讨论】:

    • 并且...不要忘记您的清单权限伙计们!
    【解决方案2】:

    这是一个应该有效的方法:

        public static String getBroadcast(){
        String found_bcast_address=null;
         System.setProperty("java.net.preferIPv4Stack", "true"); 
            try
            {
              Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces();
              while (niEnum.hasMoreElements())
              {
                NetworkInterface ni = niEnum.nextElement();
                if(!ni.isLoopback()){
                    for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses())
                    {
    
                      found_bcast_address = interfaceAddress.getBroadcast().toString();
                      found_bcast_address = found_bcast_address.substring(1);
    
                    }
                }
              }
            }
            catch (SocketException e)
            {
              e.printStackTrace();
            }
    
            return found_bcast_address;
    }
    

    【讨论】:

    • 同时使用IPv6时会抛出异常,因为它没有广播地址,getBroadcast()返回null,toString()会抛出异常。 (至少在我的 Windows 模拟器上。)易于修复,只需检查 interfaceAddress.getBroadcast() 是否为空。
    【解决方案3】:

    也许更简单的方法...

    public static String getBroadcast() throws Exception {
        System.setProperty("java.net.preferIPv4Stack", "true");
        InetAddress inet = InetAddress.getLocalHost();
        NetworkInterface net = NetworkInterface.getByInetAddress(inet);
        InterfaceAddress [] interfaceAddresses = net.getInterfaceAddresses().toArray(new InterfaceAddress[0]);
        if ( interfaceAddresses.length > 0 ) {
            return interfaceAddresses[0].getBroadcast().toString().substring(1);
        } else {
            return "255.255.255";
        }
    }
    

    【讨论】:

    • 不应该是“255.255.255.255”吗?
    【解决方案4】:

    由于广播IP地址是当前IP地址但以255结尾,你可以这样做:

    public 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()) {
                        return inetAddress.getHostAddress().toString();
                    }
                }
            }
        } catch (SocketException ex) {}
        return null;
    }
    
    public static String getBroadcast() throws SocketException {
        System.setProperty("java.net.preferIPv4Stack", "true");
        for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces(); niEnum.hasMoreElements();) {
            NetworkInterface ni = niEnum.nextElement();
            if (!ni.isLoopback()) {
                for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) {
                    return interfaceAddress.getBroadcast().toString().substring(1);
                }
            }
        }
        return null;
    }
    

    【讨论】:

    • 这是在(可能没有根据)假设网络掩码是 255.255.255.255。您实际上应该获取与您检索到的地址关联的网络掩码,然后计算 bcast = ipAddress | ~netmask
    • 我在想,你将如何实现这样的事情?干杯
    • "由于广播 IP 地址是当前 IP 地址,但以 25 结尾" ... 不。典型的家庭网络的广播地址为 0.255,但通常情况并非如此。
    • A 类子网 192.168.0.1 -> 192.168.0.126,子网掩码为 255.255.255.128,广播地址为:192.168.0.127
    • 谢谢,当您删除时,我会支持您的回答:“由于广播 IP 地址是当前 IP 地址,但以 255 结尾”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2014-09-04
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多