Android appareil ne reçoit pas de paquet de multidiffusion
Je développe une application de chat où Android clients vont échanger leurs adresses IP à l'aide de la multidiffusion UDP ().
Chaque appareil enverra son adresse ip pour plusieurs clients(tous les périphériques de l'exécution de cette application) dans un Thread séparé. Il y aura un autre récepteur fil qui sera à l'écoute de ces paquets de multidiffusion. Voici mon code.
//Multidiffusion code.
DatagramSocket socket = new DatagramSocket(9898);
byte buff[] = ip.getBytes();
DatagramPacket packet = new DatagramPacket(buff, buff.length, InetAddress.getByName("224.0.0.1"),9999);
socket.send(packet);
socket.close();
//Code récepteur
MulticastSocket socket = new MulticastSocket(9999);
InetAddress group = InetAddress.getByName("224.0.0.1");
socket.joinGroup(group);
DatagramPacket packet;
byte[] buf = new byte[256];
byte b = 'x'; //just a separator for time being
Arrays.fill(buf,b);
packet = new DatagramPacket(buf, buf.length);
String received= "";
while(received!=null)
{
socket.receive(packet);
received = new String(packet.getData());
received = received.substring(0,received.indexOf('x'));
this.setIp(received);
System.out.println("Address: " + received);
}
socket.leaveGroup(group);
socket.close();
Le problème est que chaque appareil imprime sa propre adresse. Il semble qu'il n'écoute jamais les autres packages de multidiffusion(je veux dire qu'il doit imprimer les autres adresses ip). Je reçois aussi un journal ci-dessous, vous ne savez pas si c'est lié.
11-04 23:56:17.985: I/OSNetworkSystem(603): mcastAddDropMembership interfaceIndex=0
Toute aide sera appréciée.
OriginalL'auteur Shashank Kadne | 2012-11-04
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'acquérir une MulticastLock dans votre application, ce qui va permettre à votre application de recevoir des paquets qui ne sont pas abordés de manière explicite à cet appareil sur le réseau.
Autorisation requis:
Exemple de code:
Je ne pense pas que c'est possible sur Android, voir si la réponse ici aide.
Merci je vais jeter un oeil.
J'ai revu un de mes projet récemment, qui utilisent JmDNS pour certains de multidiffusion de l'opération. La version de démonstration d'auto-publier un simulacre de service mdns et détecter sur l'appareil. J'ai effectivement oublier que j'utilise pour tester et exécuter de nombreuses fois sous réseau 3G. Je viens de vérifié le comportement et je peux confirmer maintenant
WifiManager.MulticastLock
travaille sous réseau 3G (même si le WIFI est allumé/éteint, avec la 3G, d'être actif dans la barre d'état). S'il vous plaît essayez-la et laissez-moi savoir si cela fonctionne sur votre fin.Comme vous pouvez le voir, mon demo app de créer et de détecter la maquette mdns service par lui-même dans le même réseau (quel que soit 3G ou WIFI). Dans votre cas, si le mdns paquets (dit soulevées à partir d'un autre réseau) est accessible dans le réseau de votre téléphone (peut avoir besoin de certaines de routage), il devrait fonctionner comme prévu.
OriginalL'auteur yorkw
IPv4 multicast soutien à android est poorely mis en œuvre. Il y a des bugs de cupcake époque encore présents.
J'ai rencontré un problème similaire, j'ai été faire un projet qui repose sur mDNS/multicast pour la découverte de services. Mon application Android serait tout simplement pas à vous abonner au groupe de multidiffusion. J'ai vérifié cela en créant un portable point d'accès sur une Ubuntu 14.04 machine et l'exécution de tcpdump. Les appareils Android connecté il n'a tout simplement pas émettre des messages IGMP requises pour rejoindre un groupe. Je pourrais envoyer des paquets mais pas les recevoir.
Ce que j'ai remarqué que je recevais une IPv6 rejoindre message de groupe de tous les systèmes chaque fois que j'ai rejoint le réseau. Ce qui m'a incité à tenter une adresse de multidiffusion IPv6 et que travaillé.
Nouveaux appareils android en charge de l'IPv6, qui a intégré et obligatoire le support de multidiffusion. Donc, au lieu d'utiliser une Classe de 4 IPv4 adresse de multidiffusion, modifier votre code pour utiliser une adresse IPv6. Cela rendra votre code pour travailler sur au moins au niveau local.
http://developer.android.com/reference/java/net/Inet6Address.html
Cette page est une mine d'information sur IP à utiliser en fonction de vos besoins.
Certains disent que cela fonctionne sans le WiFiManager.crrateMulticastLock() mais je n'ai pas testé.
La multidiffusion à des réseaux mondiaux est certainement possible théoriquement. Mais je n'ai jamais vu un succès de la mise en œuvre pratique d'une. Compte tenu de l'ésotérique, les routeurs et les pare-feu qui existent tout autour.
Ce DONC, la question montre comment elle est faite sur le bureau. Le même code fonctionne également avec android.
IPv6 Multicast exemple
OriginalL'auteur agathver