2010-06-07 45 views
8

Tôi đang tạo ứng dụng Máy khách cho điện thoại Android của mình.Địa chỉ phát sóng Android

Tôi đã tạo một Máy chủ UDP trong Python có thể ngồi và nghe các kết nối.

Tôi có thể đặt địa chỉ máy chủ IP trực tiếp như 192.169.0.100 và nó sẽ gửi dữ liệu tốt. Tôi cũng có thể đặt trong 192.168.0.255 và nó tìm thấy máy chủ trên 192.169.0.100.

Có thể nhận địa chỉ quảng bá của mạng mà điện thoại Android của tôi được kết nối không? Tôi sẽ chỉ sử dụng ứng dụng này trên mạng Wifi của mình hoặc các mạng khác Wifi.

Cheers

Trả lời

1

Là địa chỉ quảng bá IP là địa chỉ IP hiện tại nhưng kết thúc với 255, bạn có thể làm một cái gì đó như thế này:

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

Đó là làm cho (có thể không chính đáng) giả định rằng các netmask là 255.255.255.255. Bạn thực sự sẽ nhận được mặt nạ mạng liên kết với địa chỉ mà bạn đã truy xuất, và sau đó tính toán 'bcast = ipAddress | ~ netmask' – hobbs

+0

Tôi đã nghĩ rằng, làm thế nào bạn sẽ thực hiện một điều như vậy? Chúc mừng – RailsSon

+9

"Vì địa chỉ IP phát sóng là địa chỉ IP hiện tại nhưng kết thúc bằng 25" ... không. một mạng gia đình điển hình có một addr bcast là 0,55, nhưng điều đó không đúng nói chung. –

6

Đây là một phương pháp mà nên làm việc:

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

Từ

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

Điều này có lợi thế là chỉ xem WIFI. Tôi biết OP cho biết "Tôi chỉ bao giờ sẽ sử dụng ứng dụng này trên mạng Wifi của tôi hoặc các mạng Wifi khác." nhưng nó đáng nói đến điều này trong trường hợp người khác cần một thay thế không wifi.

+0

và ... đừng quên folks quyền hiển thị của bạn! ssimm

0

Một cách đơn giản hơn có lẽ ...

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"; 
    } 
} 
Các vấn đề liên quan