2010-06-07 104 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"; 
    } 
}