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

Entrée/Sortie Java Discussion :

[SOCKET] soucis avec readInt()


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 22
    Points : 15
    Points
    15
    Par défaut [SOCKET] soucis avec readInt()
    Bonjour tout le monde. Je commence a peine a manipuler les sockets et dès le début je galère déja lol ! En bref j'ai reussi a etablir une connexion entre mon client en AS3 , et mon serveur en JAVA (Youpi !!!). Maintenant j'essaye d'échanger des données entre ces derniers, et là tout se complique. Je n'arrive pas à comprendre pourquoi dans mon code AS3 la premiere méthode fonctionne mais pas la deuxieme. Je rentre dans le detail :

    Première méthode :
    Je connecte mon socket , j'ecoute mon socket, s'il se connecte(EVENT.CONNECT) j'envoie des entier à mon serveur :
    Code AS3 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private function socketConnect(event:Event):void {
                trace("Connected: " + event);
    			socket.writeInt(32);
            }

    et même celui ci fonctionne :
    Code AS3 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private function socketConnect(event:Event):void {
                trace("Connected: " + event);
    	    socket.writeInt(32);
                socket.writeInt(35);
                socket.writeInt(8);
                socket.writeInt(12);
                socket.writeInt(80);		
            }

    coté serveur je lis les donées reçu à l'aide de readInt(). Tout s'affiche correctement dans la console :
    Deuxieme méthode :
    Maintenant au lieu ce soit à l'evenement CONNECT , je met ce même code dans l'evenement CLICK d'un bouton :
    Code AS3 : Sélectionner tout - Visualiser dans une fenêtre à part
    send.addEventListener(MouseEvent.CLICK, sendPaquet);
    Code AS3 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private function sendPaquet(event:MouseEvent):void{	
    	    socket.writeInt(32);
                socket.writeInt(35);
                socket.writeInt(8);
                socket.writeInt(12);
                socket.writeInt(80);			
    }

    Et bien là le console n'affiche strictement rien ! Comme si elle ne recevait strictement rien. Je pense que le problème se trouve au niveau du serveur. Qui lit si le socket envoit des données dès sa connexion. Une fois qu'il a tout lut, il ne lit plus rien. Mais d'où viendrais le problème ? J'y ai passé toute la journée sans trouver la réponse , la je bloque, j'ai essayer la méthode flush() , mais le resultat est le même. Pouvez vous m’éclaircir ?

    Voici le code de la class MAIN du CLIENT :
    Code AS3 : 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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    	public  class Main extends Sprite
    	{
     
    		public var boutonConnct:Bouton = new Bouton("Connect", 400, 25);
    		public var boutonDecnnct:Bouton = new Bouton("Deconnect", 400, 25);
    		public var send:Bouton = new Bouton("Envoyer", 300, 25);
    		public var socket:Socket = new Socket();
    		public function Main() 
    		{
     
    			if (stage) 
    			init();
    			else addEventListener(Event.ADDED_TO_STAGE, init);
    		}
     
    		private function init(e:Event = null):void 
    		{
    			removeEventListener(Event.ADDED_TO_STAGE, init);
     
    			addChild(boutonConnct);
    			addChild(send);
    			boutonConnct.addEventListener(MouseEvent.CLICK, connectToServer);
    			boutonDecnnct.addEventListener(MouseEvent.CLICK, DiscoToServer);
    			send.addEventListener(MouseEvent.CLICK, sendPaquet);
     
    		}
     
    		private function connectToServer(event:MouseEvent):void
    		{
    			trace("Connexion au serveur....");
    			removeChild(boutonConnct);
                            socket.addEventListener(Event.CONNECT, socketConnect);
                            socket.addEventListener(Event.CLOSE, socketClose);
                            socket.addEventListener(IOErrorEvent.IO_ERROR, socketError);
                            socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityError);
    			socket.addEventListener(ProgressEvent.SOCKET_DATA, _onSocketDataHandler);
    			try {
                            socket.connect("127.0.0.1", 2030);
                            }catch (e:Error) {
                            trace("Error on connect: " + e);        
                            }
    			addChild(boutonDecnnct);
     
    		}
    		private function DiscoToServer(event:MouseEvent):void
    		{
     
    			trace("Deconnection au serveur...");
    			removeChild(boutonDecnnct);
    			addChild(boutonConnct);
    			socket.close();
    		}
    		private function socketConnect(event:Event):void {
     
                          trace("Connected: " + event);			
                    } 
                    private function socketClose(event:Event):void {
     
                     trace("Connection closed: " + event);
                    }
                    private function socketError(event:IOErrorEvent):void {
     
                    trace("Socket error: " + event);
                    }
                    private function securityError(event:SecurityErrorEvent):void {
     
                    trace("Security error: " + event);
                    }	
    		private function sendPaquet(event:MouseEvent):void
    		{		
    			socket.writeInt(32);
                            socket.writeInt(35);
                            socket.writeInt(8);
                            socket.writeInt(12);
                            socket.writeInt(80);	
     
    		}
    	}
     
    }

    Et voici le code de la class MAIN du serveur :

    Code JAVA : 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
     
    public class Main {
     
    	public static void main(String[] args) throws IOException
        {
            ServerSocket serverSocket = null;
            Socket connection = new Socket();
            InputStream in = null;
            boolean listening = true;
     
            try
            {
                serverSocket = new ServerSocket(2030);
                System.err.println("The server is now bound to port.");
            }
            catch (IOException e)
            {
                System.err.println("Could not bind server to port.");
                System.exit(-1);
            }
     
            while (listening)
            {
                connection = serverSocket.accept();
                if(connection!=null)
                {
                    System.err.println("Connection to client has been established.");
     
                    in = connection.getInputStream();
                    listening = false;
                }
            }
            while (!listening)
            {
            	DataInputStream DataInput = new DataInputStream(in);
     
                    System.out.println("Recu " +DataInput.readInt());
                }
            }
     
        }

    J'espère que quelqu'un sera m'expliquer car la je ne comprend absolument pas pourquoi ça ne marche pas. En vous remerciant !

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu crée un DataInputStream à chaque tour de boucle. Pas bien. Crée en un seul avant la boucle.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    C'est ce que j'ai fais, j'ai le même problème ... Je l'ai placé entre les deux boucle :

    Code JAVA : 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
     
    ServerSocket serverSocket = null;
            Socket connection = new Socket();
            InputStream in = null;
     
            boolean listening = true;
     
            try
            {
                serverSocket = new ServerSocket(2030);
                System.err.println("The server is now bound to port.");
            }
            catch (IOException e)
            {
                System.err.println("Could not bind server to port.");
                System.exit(-1);
            }
     
            while (listening)
            {
                connection = serverSocket.accept();
                if(connection!=null)
                {
                    System.err.println("Connection to client has been established.");
     
                    in = connection.getInputStream();
                    listening = false;
                }
            }
            DataInputStream DataInput = new DataInputStream(in); // Declaration entre les deux boucle WHILE
            while (!listening)
            {
     
     
                    System.out.println("Recu " +DataInput.readInt());
                }
            }
    ]

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    dans ce cas j'en conclue que le problème se situe du coté de AS3, mais je ne connais pas ce langage, je ne peux pas t'aider.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    J'ai trouvé ma réponse seul comme un grand ! Alors d'après mes test cette ligne de code :
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    DataInputStream DataInput = new DataInputStream(in);

    n'influe pas sur la lecture. Qu'elle soit déclaré dans la boucle WHILE ou non.

    En Effet le soucis se situais coté AS3. Et le problème viens d'ici :
    Code AS3 : Sélectionner tout - Visualiser dans une fenêtre à part
    public var socket:Socket = new Socket();

    Il semblerais que cette classe ne soit pas adapté pour envoyer des données comme je le voudrais. En revanche celle qui résolu tout est celle si :
    Au lieu de créer une instance de SOCKET, j'utilise XMLSocket !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public var socket:XMLSocket = new XMLSocket();
    et pour envoyer des donnée plus besoin d'utiliser writeInt() mais :


    Exemple sur mon bouton "Envoyer" à l'evenement CLICK du bouton :
    Code AS3 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private function sendPaquet(event:MouseEvent):void
    			socket.send("test");
    		}


    A chaque Clique sur le bouton mon serveur Reçoit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Recu 116 
    Recu 101 
    Recu 115 
    Recu 116
    Et si on remarque bien chaque ligne correspond au code ASCII de chaque Lettre du mon "test" ! Plus qu'a faire la conversion coté serveur... Et soucis résolu !
    116 correspond à la letre -t en ASCII. Par exemple.

    Voila ! Finalement c'était tout bête mais maintenant j'aimerais bien comprendre pourquoi cette difference entre ces Deux classes : Socket & XMLSocket.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Hello,

    quelque part, félicitations d'avoir cherché une solution et d'avoir trouvé un truc qui marche, mais bon... Sans rien connaître d'ActionScript je soupçonne que ce n'était pas la bonne solution.

    Citation Envoyé par zozimama Voir le message
    Voila ! Finalement c'était tout bête mais maintenant j'aimerais bien comprendre pourquoi cette difference entre ces Deux classes : Socket & XMLSocket.
    Je crains qu'un forum Java ne soit pas le meilleur endroit pour poser des questions sur ActionScript.
    Mais on peut imaginer pas mal de choses, par exemple l'une d'elle qui fait du flush automatique et l'autre pas, parce que les usages sont différents par nature.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Client/Serveur : probleme communication avec flux clavier
    Par Romvaillant dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 02/03/2009, 16h23
  2. recherche solution client/serveur java
    Par vero55 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 26/03/2007, 17h18
  3. Client/Serveur en C avec OpenSSL
    Par baallrog dans le forum C
    Réponses: 2
    Dernier message: 14/01/2007, 06h26
  4. Réponses: 1
    Dernier message: 11/05/2006, 12h46
  5. [JBoss] Réaliser un client-serveur Java
    Par Sylario dans le forum Wildfly/JBoss
    Réponses: 8
    Dernier message: 04/04/2006, 16h28

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