socket multiThread serveur JAVA / client FLEX
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:
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:
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:
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 ;)