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 :

echange de donnees par socket


Sujet :

Flex

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut echange de donnees par socket
    Bonsoir,
    j'utilise Flex3 AIR pour réaliser une interface graphique qui doit discuter avec un serveur via des sockets.

    Coté Flex, la connexion se passe bien, l'écriture ne semble pas poser de problème.
    Coté serveur, la connexion est ok, mais aucune donnée n'arrive.

    En fait toutes les données émises arrivent au serveur lorsque je fait un close du socket.
    Je fais un flush après chaque write, mais rien coté serveur.

    Je ne sais plus quoi faire, toutes les recherches sur les forums me font dire que mon code est correct et que cela devrait fonctionner, mais hélas non.
    Si quelqu'un a une idée, je suis preneur.
    Merci d'avance.

    Voici le code coté Flex si cela peut aider
    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
    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
    82
    83
    84
    85
    86
    87
    88
    89
     
    <?xml version="1.0" encoding="utf-8"?>
    <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" >
       <mx:Script>
       	<![CDATA[
     
    import flash.errors.*;
    import flash.events.*;
    import flash.net.Socket;
     
    	private var s:Socket=new(Socket);
        private var response:String;
     
        private function Connect():void {
     
            configureListeners();
            s.connect("localhost", 843);
        }
     
        private function configureListeners():void {
            s.addEventListener(Event.CLOSE, closeHandler);
            s.addEventListener(Event.CONNECT, connectHandler);
            s.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            s.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
        }
     
    	private function Close():void {
    		s.close();	
            ST.text="closed";
            BTConnect.enabled=true;
    	}
     
        private function writeln(str:String):void {
            str += "\n";
            try {
                s.writeUTFBytes(str);
            }
            catch(e:IOError) {
                trace(e);
            }
        }
     
        private function Send():void {
            //response = "";
            writeln(MSG.text);
            s.flush();
        }
     
        private function readResponse():void {
            var str:String = s.readUTFBytes(s.bytesAvailable);
            response += str;
        }
     
        private function closeHandler(event:Event):void {
            ST.text="closed by server";
            BTConnect.enabled=true;
        }
     
        private function connectHandler(event:Event):void {
            ST.text="connected";
            BTConnect.enabled=false;
        }
     
        private function ioErrorHandler(event:IOErrorEvent):void {
            ST.text="IO Erreur";
        }
     
        private function securityErrorHandler(event:SecurityErrorEvent):void {
            ST.text="Security Erreur";
        }
     
        private function socketDataHandler(event:ProgressEvent):void {
            ST.text="Data to read";
        }
    	]]>
       </mx:Script>
     
     
     
    	<mx:Button x="23" y="21" label="connect" enabled="true" id="BTConnect" click="Connect();"/>
    	<mx:Button x="23" y="49" label="close" id="BTClose" enabled="{!BTConnect.enabled}" click="Close();"/>
    	<mx:Button x="356" y="83" label="Envoyer" id="BTSend" enabled="{!BTConnect.enabled}" click="Send();"/>
    	<mx:Label x="23" y="85" text="Texte a ecrire"/>
    	<mx:TextInput id='MSG' x="127" y="85" text="Text" width="186" />
    	<mx:Label x="23" y="144" text="Status"/>
    	<mx:Text id='ST' x="101" y="143" text="Not Connected" width="328"/>
     
    </mx:WindowedApplication>

  2. #2
    Membre émérite
    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
    Par défaut
    Je ne vois rien d'anormal dans ton code.
    Le problème provient certainement du protocole de réception côté serveur.
    Il est probable que la fermeture du socket déclenche côté serveur le traitement des données.
    Quel type de serveur est-ce ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    Merci, pour ton retour.
    J'utilise divers serveurs (faut bien tester quand rien ne marche) mais le comportement est toujours le même.

    Les serveurs répondent bien, ils sont utilisés par des programmes en C++ et C# sans problème.

    J'ai récupéré un petit serveur en perl sur le web, et la encore, même problème, affichage de mon send qu'apres le close socket.

    C'est peut-être un probleme de config, mais je ne sais plus où chercher.

    Pour info le code du mini serveur de test perl (qui est un sample de flash sercurity policy server).

    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
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    #!/usr/bin/perl
    #
    # policyd.pl
    # Simple socket policy file server
    #
    # Usage: policyd.pl [-port=N] -file=FILE
    # Logs to stdout
    #
     
    use strict;
    use Socket;
     
    my $NULLBYTE = pack( 'c', 0 );
     
    my $port = 843;
    my $filePath;
    my $content;
     
    ### READ ARGS
     
    while ( my $arg = shift @ARGV )
    {
        if ( $arg =~ m/^--port=(\d+)$/ )
        {
            $port = $1;
        }
        elsif ( $arg =~ m/^--file=(.*)/ )
        {
            $filePath = $1;
        }
    }
     
    unless ( $filePath )
    {
        die "Usage: policyd.pl [--port=N] --file=FILE\n";
    }
     
    ### READ FILE
     
    -f $filePath or die "No such file: '$filePath'\n";
    -s $filePath < 10_000 or die "File probably too large to be a policy file: '$filePath'\n";
     
    local $/ = undef;
    open POLICYFILE, "<$filePath" or die "Can't open '$filePath': $!\n";
    $content = <POLICYFILE>;
    close POLICYFILE;
     
    $content =~ m/cross-domain-policy/ or die "Not a valid policy file: '$filePath'\n";
     
    ### BEGIN LISTENING
     
    socket( LISTENSOCK, PF_INET, SOCK_STREAM, getprotobyname( 'tcp' ) ) or die "socket() error: $!";
    setsockopt( LISTENSOCK, SOL_SOCKET, SO_REUSEADDR, pack( 'l', 1 ) ) or die "setsockopt() error: $!";
    bind( LISTENSOCK, sockaddr_in( $port, INADDR_ANY ) ) or die "bind() error: $!";
    listen( LISTENSOCK, SOMAXCONN ) or die "listen() error: $!";
     
    print STDOUT "\nListening on port $port\n\n";
     
    ### HANDLE CONNECTIONS
     
    while ( my $clientAddr = accept( CONNSOCK, LISTENSOCK ) )
    {
        my ( $clientPort, $clientIp ) = sockaddr_in( $clientAddr );
        my $clientIpStr = inet_ntoa( $clientIp );
        print STDOUT "Connection from $clientIpStr:$clientPort\n";
     
        local $/ = $NULLBYTE;
        my $request = <CONNSOCK>;
        chomp $request;
     
        if ( $request eq '<policy-file-request/>' )
        {
            print STDOUT "Valid request received\n";
        }
        else
        {
            print STDOUT "Unrecognized request: $request\n\n";
            close CONNSOCK;
            next;
        }
     
        print CONNSOCK $content;
        print CONNSOCK $NULLBYTE;
        close CONNSOCK;
     
        print STDOUT "Sent policy file\n\n";
    }
     
    # End of file.

  4. #4
    Membre émérite
    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
    Par défaut
    Je ne parle pas PERL...

    sinon la notation suivante est normalement invalide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private var s:Socket=new(Socket);
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private var s:Socket=new Socket();

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    Ok, j'ai changé le code, mais ca ne change pas le comportement.
    Le serveur n'affiche les messages qu'après le close.

    J'ai migré le développement sous browser, même résultat sauf que le serveur de sécurité est :
    - d'abord appelé par flash (comportement normal à partir de la V10) visiblement flash fait un write, puis un read pour récupérer le fichier restitué par le serveur.
    - puis par mon appli mais les messages ne sont affichés qu'apres le close

    ci joint la copie de la log du serveur :


    Listening on port 843

    Connection from 127.0.0.1:2870
    Valid request received
    Sent policy file

    Connection from 127.0.0.1:2871
    Unrecognized request: Hello
    Hello2
    Hello23

  6. #6
    Membre émérite
    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
    Par défaut
    Je ne sais que dire. J'utilise intensivement la classe Socket et je n'ai pas de problème de ce type.

    Il faudrait essayer d'envoyer des données en volume pour voir si le serveur réagit sans déconnexion. Cela confirmerait l'existence d'un buffer qui ne se vide pas.

    Il suffit de faire une boucle dans le writeln par exemple.

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

Discussions similaires

  1. echange de donnees clients/clients avec les sockets
    Par mbousoli dans le forum Entrée/Sortie
    Réponses: 16
    Dernier message: 06/03/2014, 10h25
  2. [Débutant] Problème Envoi/reception de donnee par socket
    Par Kisskool83 dans le forum VB.NET
    Réponses: 2
    Dernier message: 30/06/2011, 13h11
  3. Probleme reception de donnees par Socket
    Par herrs dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 10/07/2008, 11h29
  4. Probleme : echange de fichiers par socket
    Par blackjack69 dans le forum Langage
    Réponses: 1
    Dernier message: 29/04/2008, 02h23
  5. [Débutant] Envoi de fichier par socket
    Par zapho dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 26/05/2004, 18h58

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