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

Lazarus Pascal Discussion :

Petit problème d'échange de strings entre client et serveur si applis différentes [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 913
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 913
    Points : 15 350
    Points
    15 350
    Par défaut Petit problème d'échange de strings entre client et serveur si applis différentes
    Bonsoir,

    je m'amuse à faire tourner un serveur et un client TCP en console grâce aux composants fournis en natif avec fpc et à un peu de code trouvé là, et ma foi, ça fonctionne.
    Mais impossible de porter tout ça dans une appli graphique.

    Je viens donc d'installer les composants LNet et ça fonctionne aussi (à condition de virer le composant SSL dans l'exemple "visual/tcpudp" : le prog fonctionne dans l'IDE mais j'ai une grosse erreur au lancement de l'appli compilée, , donc impossible d'avoir un prog client et un prog serveur en même temps avec SSL...)

    Le souci, c'est de faire causer le client console avec le serveur graphique, ou inversement :
    les connexions se font bien, c'est l'échange de messages qui coince, et je suspecte un pb d'encodage, mais lequel ?

    • Quand le client console envoie une AnsiString, le memo sur le serveur graphique m'affiche un code Unicode et c'est tout (vous savez, le carré avec 4 chiffres dedans).
      J'ai beau rajouter AnsiToUTF8 à la chaîne reçue, même résultat.

    • Quand le client graphique envoie une chaîne (qui doit être UTF8, elle vient d'un TEdit) au serveur console, celui-ci n'affiche rien...
      J'ai beau rajouter UTF8ToAnsi à la chaîne avant de l'envoyer, même résultat.

    Une idée ?

    Merci merci,

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    bonjour,

    je doute que ce soit un problème d'encodage UTF8 -> Ansi, au pire tu aurais des caractères anormaux pour les accents (été au lieu de été), le reste n'est pas touché.

    Si tu es en Unicode, ça devient #0'é'#0't'#0'é', et là éventuellement le #0 peut devenir une fin de chaîne de type PChar.

    mais déjà le plus simple est d'afficher la longueur de ce que tu reçois qui ne doit pas être vide, et qui doit correspondre au nombre de lettre si c'est de l'ANSI au double de ce nombre si c'est de l'Unicode et un nombre variable >= au nombre attendu dans le cas d'UTF8

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 913
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 913
    Points : 15 350
    Points
    15 350
    Par défaut
    Bonjour, Paul, et les autres.

    Cette histoire de longueur j'y avais pensé aussi mais je m'y prenais mal
    Je faisais comme ça : Add2Memo(s + ', len: ' + IntToStr(UTF8Length(s)));, et ça ne m'affichait que le caractère bizarre

    Je m'y suis pris autrement :
    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
    // code serveur
      if aSocket.GetMessage(s) > 0 then begin
        ShowMessage(IntToStr(UTF8Length(s))); // --> 9 ou 14, voir code client
        Add2Memo(s + ', len: ' + IntToStr(UTF8Length(s))); // car. bizarre ou pas
     
    // code client
          try
            Active := True;
            EventLoop.Run;
            Stream.WriteAnsiString('Hello'); // 9 dans serveur-ShowMessage + caractère bizarre
            // dessus ou dessous au choix
            Stream.WriteAnsiString('HelloHello'); // 14 dans serveur-ShowMessage et pas de car. zarbi
            Active := False;
          except
            //
          end;
    La fonction Add2Memo(aString); se contente d'ajouter (Memo.Append) la chaîne passée et positionne le curseur sur la dernière ligne.

    J'avoue ne pas trop comprendre ce qui se passe, là.

    J'attends vos idées avec impatience, et vous souhaite une bonne journée,

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 913
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 913
    Points : 15 350
    Points
    15 350
    Par défaut
    Bon,

    je crois que j'ai trouvé :

    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /// code client
            Stream.WriteAnsiString('Hello'); // 9 dans serveur-ShowMessage 
            // dessus ou dessous au choix
            Stream.WriteAnsiString('HelloHello'); // 14 dans serveur-ShowMessage
    Un p'tit coup de F1 sur WriteAnsiString me montre ça :
    (...) The ansistring is written as a 4 byte length specifier, followed by the ansistring's content. (...)
    Et oui, "9" = 4 + 5 car., "14" = 4 + 10 car.

    Me reste plus qu'à recoder l'appli console sans utiliser Write/Read AnsiString...
    Ou à recoder l'appli graphique en utilisant les Streams.

    Si quelqu'un pouvait me dire quelle direction prendre pour être le plus universel possible, l'idée finale étant de faire causer une machine Linux et une machine Windows virtualisée et hébergée sur la machine Linux.

    Bon week-end,

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 913
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 913
    Points : 15 350
    Points
    15 350
    Par défaut
    Citation Envoyé par Jipété Voir le message
    (...) Si quelqu'un pouvait me dire quelle direction prendre pour être le plus universel possible, l'idée finale étant de faire causer une machine Linux et une machine Windows virtualisée et hébergée sur la machine Linux.

    Bon week-end,
    Alors, devant l'enthousiaste général et quasi hystérique soulevé par cette interrogation , j'ai fait des tests avec un client Windows développé (en son temps...) avec un vieux D6 et les magnifiques composants (et exemples !) ICS de l'ami François P. (que je remercie bien fort ), j'ai gardé le serveur Laz sous Linux avec ses composant LNet et ma foi, ça cause bien !

    Allez, vais cliquer sur

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/06/2012, 16h36
  2. échange de fichiers entre clients et serveur
    Par l_seringa dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/05/2010, 00h13
  3. problème lors d'un dialogue entre client et serveur
    Par Dave62 dans le forum Réseau
    Réponses: 3
    Dernier message: 10/12/2008, 09h24
  4. [ODBC] Problème entre client windows, serveur windows
    Par Mascotte dans le forum Installation
    Réponses: 13
    Dernier message: 13/09/2006, 12h15
  5. [VB.NET]petit problème avec la classe string !!
    Par zouhib dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/06/2006, 11h58

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