2010-06-07 58 views
8

我正在为我的Android电话制作客户端服务器应用程序。Android广播地址

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

我可以把服务器IP地址直接放入,就像192.169.0.100一样,它发送的数据正常。我也可以在192.168.0.255,它找到192.169.0.100服务器。

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

干杯

回答

1

随着广播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; 
} 
+4

这使得(可能是不必要的)假设子网掩码为255.255.255.255。实际上你应该获得与你检索的地址相关的网络掩码,然后计算'bcast = ipAddress | 〜netmask' – hobbs 2010-06-08 00:41:41

+0

我在想,你会如何实现这样的事情?欢呼 – RailsSon 2010-06-08 09:13:14

+9

“由于广播IP地址是当前IP地址,但以25结束”......不。一个典型的家庭网络有一个.255的bcast addr,但通常情况并非如此。 – 2011-11-11 22:16:39

6

这里有一个方法,应该工作:

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; 
} 
13

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替代方案。

+0

和...不要忘记您的清单许可人员! ssimm 2017-03-14 10:43:27

0

也许更简单的方法...

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"; 
    } 
}