2013-10-01 5 views
1

J'écris une application Android qui communique sur un MulticastSocket. Cela fonctionne très bien, mais j'ai rencontré un bug étrange: chaque fois que la connexion est interrompue et restaurée (par exemple, l'appareil perd brièvement la connexion WiFi), l'application peut toujours envoyer mais ne rien recevoir. Lors de l'envoi des autres périphériques, recevez le paquet, mais lorsque d'autres périphériques envoient des paquets, le périphérique ne les reçoit pas.MulticastSocket peut envoyer mais ne pas recevoir

J'ai vérifié que le fil du récepteur est toujours opérationnel. Il est coincé dans socket.receive. L'ajout d'un délai d'attente de socket n'a pas aidé, il a simplement fait passer le temps de réception sans rien recevoir.

Lorsque je ferme et rouvre le MulticastSocket, tout fonctionne correctement. J'ai enregistré un BroadcastReceiver pour les changements de connectivité qui se reconnecte lorsque la connexion est perdue et restaurée. Cela atténue un peu le problème, mais il se produit toujours lorsque la connexion est interrompue à un autre point (par exemple, redémarrage du serveur).

Donc je dois soit fixer le socket.recevoir ou trouver de façon fiable quand le socket ne peut plus recevoir de paquets afin de le fermer et de le rouvrir. Aucune suggestion?

code:

private MulticastSocket socket; 

public void open() throws IOException { 
    socket = new MulticastSocket(serverAddress.getPort()); 
    socket.joinGroup(serverAddress.getAddress()); 

    receiver = new Receiver(); 
    receiver.start(); 
} 

private void send(MyPacket packet) throws IOException { 
    if (socket == null) 
     throw new IOException("Connection closed"); 

    DatagramPacket datagramPacket = 
      new DatagramPacket(packet.getBuffer(), packet.getSize(), serverAddress); 
    socket.send(datagramPacket); 
} 

private class Receiver extends Thread { 
    @Override 
    public void run() { 
     while (!closing) { 
      if (socket == null) 
       return; 

      try { 
       socket.receive(packet); 
      } catch (IOException e) { 
       close("IOException in receiver thread", e); 
       return; 
      } 

      onPacketReceived(packet); 
     } 
    } 
} 

Répondre

0

Il semble que semble que le soutien Multicast dans Android n'est pas aussi solide que certains d'utilisation pourrait l'espérer. Voir http://codeisland.org/2012/udp-multicast-on-android/

C'est à dire si cela fonctionne réellement ou peut dépendre de l'appareil. Cela ne fonctionne pas sur mon Nexus5.

Il y a un certain nombre de bugs liés au soutien Multicast sur Android, mais je soupçonne que vous tombez sous le coup de https://code.google.com/p/android/issues/detail?id=1698

0

Si vous pouvez détecter quand le wifi descend et, je suggère de quitter et de rejoindre le groupe plutôt que de fermer et rouvrir le socket.

Questions connexes