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
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();  
  }
la aucun problème tous les clients reçoivent ce que les autres clients envoi.
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é.
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();  
  }
ce code fonctionne tres bien si je me co avec des clients TELNET. par contre avec des clients FLEX seul la premiere commande passe.
c'est pourquoi je pense que le probleme viendrait de FLEX
mon code 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); 
}
donc pour résumer en FLEX :
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