Android no puede recibir paquetes de multidifusión

Estoy jugando un poco con sockets multicast. Escribo un servidor que envía un mensaje a un cliente android. Hasta el momento, el cliente sólo debe registrar el mensaje recibido. Me di cuenta de que no se reciben paquetes de multidifusión en mi dispositivo.

Aquí está el código para el servidor (se ejecuta en el PC):

public class MulticastServer{ private int port; private boolean running = false; private MulticastSocket serverSocket; private InetAddress group; private String multicastAddress = "230.192.0.11"; public MulticastServer(int port) { super(); this.port = port; init(); } public MusicStreamerServer() { this(5500); } private void init() { try { group = InetAddress.getByName(multicastAddress); serverSocket = new MulticastSocket(port); serverSocket.joinGroup(group); } catch (IOException e) { e.printStackTrace(); } } public void start() throws IOException { System.out.println("server started"); if (running) return; running = true; new Thread(new Runnable() { @Override public void run() { byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length, group, port); String msg = "msg"; while (running) { packet.setData(msg.getBytes(), 0, msg.length()); try { serverSocket.send(packet); } catch (IOException e) { e.printStackTrace(); } } } }).start(); } public void stop() throws IOException { running = false; } } 

Aquí está el código para el cliente android:

 public class MainActivity extends Activity { private MulticastSocket socket; private InetAddress group; private String multicastAddress = "230.192.0.11"; private int port = 5500; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() .permitAll().build(); StrictMode.setThreadPolicy(policy); try { group = InetAddress.getByName(multicastAddress); socket = new MulticastSocket(port); socket.joinGroup(group); socket.setBroadcast(true); } catch (IOException e) { e.printStackTrace(); Log.wtf("init", e.getMessage()); } new Thread(new Runnable() { @Override public void run() { WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock multicastLock = wm .createMulticastLock("mylock"); multicastLock.acquire(); byte[] buf = new byte[1024]; while (true) { try { socket.receive(packet); Log.d("receiver","received = " + (new String(packet.getData()))); } catch (IOException e) { e.printStackTrace(); } } } }).start(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }} 

He probado el código con 2 dispositivos diferentes. El Nexus4 y el Nexus7 (2013), ambos ejecutando el último Android.

¿Podría alguien ayudarme?

Gracias

    He visto que el problema es realmente inconsistente.

    Versión para Android: 4.2.x

    En Samsung S4 activo: Multicast está funcionando como se esperaba.

    En Samsung Nota 10.1 y Nexus 4.2.3 Multicast no funciona como se esperaba.

    239.xxx no es compatible (y, por desgracia, es el que se utiliza para la televisión multicast …) 224.0.0.251 está funcionando como se esperaba.

    Creo que tienen un error con la máscara.

    Una dirección de multidifusión es normalmente | 1 1 1 0 | MULTICAST Dirección | 224.0.0.0 – 239.255.255.255

      11100000.00000000.00000000.00000001 = 224.0.0.1 11101111.00000000.00000000.00000001 = 239.0.0.1 

    Así que la máscara debe ser 224.0.0.0/4 y no 224.0.0.0/8

    ¿Su manifiesto solicita los permisos adecuados?

     <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 

    Además, es posible que desee reproducir con la configuración avanzada en el menú WiFi del teléfono, tanto las optimizaciones de Wi-Fi como mantener Wi-Fi activado durante el sueño pueden afectar a su capacidad de hacer multicasts.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.