Bonjour,
je désir réaliser une application socket client serveur multithread. tous fonctionne correctement dans l'ensemble. je n'ai aucun problème à envoyer un message d'un client pour tous les autres clients.
par contre lorsque je modifie la partie SocketClientThread coté JAVA pour envoyer des données d'un client vers un seul autre client je souhaiterai évité la boucle sur tous les clients. donc je procède comme ceci :
voici la fonction run de mon thread socket java
la aucun problème tous les clients reçoivent ce que les autres clients envoi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 public void run() { String request; while (sender != null) { try { if ((request = reader.readLine()) != null) { if(request.contains("<data>")){ synchronized(parent.clients) { for (DexSocket c:parent.clients) { // on parcours tous les clients if (c != null) c.send(request); // on envoi les donnees } } } } } catch (Exception ioe) { if (sender != null) { parent.killClient(getIP()); return; } } Thread.yield(); } } public void send(String mess) { // trim() permet la suppression des espaces blancs writer.println(mess.trim() + (char)0x00); writer.flush(); }
par contre si je modifie pour faire les étapes suivantes :
1.première envoi je récupère le client avec qui je veux communiquer
2.deuxième envoi je communique directement avec le client sans refaire la boucle sur tous les autres clients
je vais utiliser des données sous le format string séparé par un caractere pour envoyer la commande, l'ip du contact, le texte.
exemple : 0#127.0.0.1#mon texte test
0# // == la commande
en début de class je rajoute un objet de meme type que je vais appeler clientCible dans lequel je vais mettre le client une fois trouvé.
ce code fonctionne tres bien si je me co avec des clients TELNET. par contre avec des clients FLEX seul la premiere commande passe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 private DexSocket clientCible ... public void run() { String request; while (sender != null) { try { if ((request = reader.readLine()) != null) { if(request.contains("#")){ String tab[] = request.split("#"); // je decoupe la chaine dans un tableau de string //avec des client FLEX lors du second envoi le code ne s'execute plus a partir d'ici la chaine 0#ip.de.la.cible#message : passe s'en probleme la seconde chaine 1#mon message : bloque switch(Integer.parseInt(tab[0])){ case 0: synchronized(parent.clients) { for (DexSocket c:parent.clients) { // on parcours tous les clients //si l'ip du client correspond à l'ip envoyé dans la chaine if (c.getIP().equals(tab[1])) { c.send(tab[2]); // on envoi les donnees clientCible = c; } } } break; case 1: // seconde commande synchronized(clientCible) { clientCible.send(tab[1]); //on envoi les données contenu dans la chaine apres la commande } break; } } } } catch (Exception ioe) { if (sender != null) { parent.killClient(getIP()); return; } } Thread.yield(); } } public void send(String mess) { writer.println(mess.trim() + (char)0x00); //caractere de fin de chaine pour flash writer.flush(); }
c'est pourquoi je pense que le probleme viendrait de FLEX
mon code en flex :
donc pour résumer en FLEX :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 // ActionScript file import flash.events.DataEvent; import flash.events.Event; import flash.events.IOErrorEvent; import flash.net.XMLSocket; private var client:XMLSocket; private var host:String = "ip du serveur"; private var port:int = 50000; private var monIp:String = ""; private function init():void{ client = new XMLSocket(host,port); initListener(); } private function initListener():void{ client.addEventListener(Event.CONNECT,clientEvent); client.addEventListener(Event.CLOSE, clientEvent); client.addEventListener(IOErrorEvent.IO_ERROR, clientErreur); } private function clientEvent(e:Event):void{ txtOut.text += e.type +" \n"; client.addEventListener(DataEvent.DATA,clientData); } private function clientErreur(e:IOErrorEvent):void{ } private function clientData(e:DataEvent):void{ txtOut.text += e.data + "\n"; } private function envoi(data:String):void{ client.send(data+"\r"); } //fonction appelé la premiere fois private function envoiDonnee():void{ var data:String = "0#"+ipc.text+"message test"; envoi(data); } //fonction appelé pour le deuxieme envoi quand le client cible est trouvé private function envoiDonneeDeux():void{ var data:String = "1#message test deux"; envoi(data); }
je peux envoyer d'un client a tous les clients
je ne peux pas envoyer a un seul client plus d'une fois.
en TELNET:
je peux envoyer d'un client a tous les clients
je peux envoyer d'un client a un autre client cible autant de fois que je veux.
merci d'avoir réussi à lire jusqu'ici et merci aussi pour vos futures réponses
Partager