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