IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flex Discussion :

socket multiThread serveur JAVA / client FLEX


Sujet :

Flex

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut 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 : 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

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    793
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2009
    Messages : 793
    Points : 894
    Points
    894
    Par défaut
    J'utilise intensivement les sockets Flex avec un serveur JAVA et je peux dire que cela fonctionne très bien.

    J'ai pas le temps d'étudier ton code maintenant mais je suis certain que le problème n'est pas lié à Flex.

    Tes données n'ont pas l'air au format XML, pourquoi utilises-tu un XMLSocket et pas un Socket ?
    jyl@xx
    "Simplicity does not precede complexity, but follows it." Alan Perlis

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    793
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2009
    Messages : 793
    Points : 894
    Points
    894
    Par défaut
    Doc de XMLSocket 1 :
    It is strongly advised to use the constructor form without parameters, then add any event listeners, then call the connect method with host and port parameters. This sequence guarantees that all event listeners will work properly.
    Doc de XMLSocket 2 : (méthode send)
    Converts the XML object or data specified in the object parameter to a string and transmits it to the server, followed by a zero (0) byte.
    D'après ce que j'ai pu comprendre de ton code Java tu découpes les données sur les séparateurs de ligne. Pour le premier message c'est OK mais pour le second il reste un octet 0 non lu sur le socket que tu vas lire avec le second message. Donc ton second message est en fait 0x00-0x31-0x23 etc donc c'est sans doute cela qui fait planter ton programme Java.
    jyl@xx
    "Simplicity does not precede complexity, but follows it." Alan Perlis

Discussions similaires

  1. Serveur Java - Client PHP5
    Par Mister_Kp dans le forum Services Web
    Réponses: 2
    Dernier message: 05/07/2010, 11h06
  2. Socket TCP, serveur C, client PHP
    Par Alastor Nephos dans le forum Réseau
    Réponses: 5
    Dernier message: 31/03/2009, 14h41
  3. WebService Serveur Java Client Delphi2006
    Par bixente40 dans le forum Web & réseau
    Réponses: 0
    Dernier message: 19/09/2008, 09h08
  4. Réponses: 16
    Dernier message: 05/06/2008, 11h32
  5. [DEBUTANT]WebService Serveur Java / Client .net
    Par balsa dans le forum Services Web
    Réponses: 2
    Dernier message: 31/03/2007, 00h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo