Je developpe actuellement une application dans laquelle j'utilise la communication réseau par sockets, avec le principe du multicast. Je pense avoir compris ce principe, et j'arrive à l'utiliser pour envoyer un message (chaine de caractères), avec le code suivant :
String msg = "Hello";
InetAddress group = InetAddress.getByName("228.5.6.7");
MulticastSocket s = new MulticastSocket(6789);
s.joinGroup(group);
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),
group, 6789);
s.send(hi);
Le problème qui se pose ici est que j'aurais besoin d'envoyer par la socket non pas une chaîne de caractères, mais un objet Java. Or je n'ai trouvé aucune méthode ou constructeur permettant d'encapsuler un objet dans le DatagramSocket (tous les constructeurs ne supportent apparemment qu'un tableau d'octets). J'ai vu que cela est possible par des simples sockets client-serveur, par un code ressemblant à :
Socket serveur = new Socket(adresse, port);
OutputStream sortie = serveur.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(sortie);
oos.writeObject(objet);
oos.flush();
Mais je n'y ai pas trouvé d'équivalent dans le cas des sockets multicast. Quelqu'un connaîtrait-il une possibilité pour faire véhiculer des objets par des sockets multicast ?
Merci d'avance pour votre aide.
Je n'ai pas touché la moindre fois à l'objet Multicast malheureusement. Pourrais-tu me dire ce qu'il permet de faire de plus que le socket , même si je m'en doute un peu .
__________________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne et personne ne sait pourquoi...
Salut
Il suffit d'utiliser la classe ByteArrayOutputStream comme stream de sortie. Ainsi, une fois l'objet écrit à l'aide la méthode writeObject(), tu peux récupérer un tableau d'octets grâce à la méthode toByteArray() du stream de base. Exemple:
InetAddress group = InetAddress.getByName("228.5.6.7");
MulticastSocket s = new MulticastSocket(6789);
s.joinGroup(group);
//écriture de l'objet
ByteArrayOutputStream sortie = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(sortie);
oos.writeObject(objet);
oos.flush();
byte donnees[] = sortie.toByteArray(); //on récupère les données binaires écrites
DatagramPacket hi = new DatagramPacket(donnees, donnees.length,
group, 6789);
s.send(hi);
inutile de préciser que cette méthode pose parfois des problèmes de portabilité au niveau des versions des classes (il faut que la classe de l'objet sérialisé soit identique des deux côtés).
ReaM : si je me rapelle bien le Multicast permet d'envoyer des données à un nombre très important de destinataires à la fois (un envoi multiple quoi) mais par UDP, qui est plus rapide mais moins "fiable" que TCP (pas d'accusés de réception des paquets et pas de contrôle sur l'ordre d'envoi et d'arrivé).
__________________________
Lorsque touts les arbres auront été coupés, Lorsque touts les animaux auront été chassés, Lorsque touts les poissons auront été pêchés;
Alors l'homme découvrira que l'argent ne se mange pas.
------ |_o/e _|a/a---------
Je crois avoir qu'un grand nombre de routeur ipv4 n'acceptent pas le multicast, en revanche le multicast est géré par tous les routeurs ipv6?
__________________________ Eoliennes et informatique sur freresguizmo