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

API, COM et SDKs Delphi Discussion :

Indy 10 : IOHandler.Readln() vs. IOHandler.InputBufferAsString


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2002
    Messages : 84
    Par défaut Indy 10 : IOHandler.Readln() vs. IOHandler.InputBufferAsString
    Hello,
    J'ai un problème de compréhension dans le fonctionnement du composant TIdTCPServer de Indy 10.
    Je dois communiquer avec une application (que je vais appeler "ExtApp") dont je n'ai pas les source, mais dont je sais sur quel port elle envoie les informations.
    J'ai donc créé un programme avec un TIdTCPServer qui écoute sur le port 3000 et qui affiche les infos reçues dans un mémo. Dans la méthode "Connect", je récupère juste l'IP et le port de sortie du client. Ca marche très bien. Dans la méthode "Execute", je récupère les caractères reçus via la focntion "Line := AContext.Connection.IOHandler.ReadLn();".
    Test : depuis une machine distante, j'utilise un "cmd.exe" puis je saisi "telnet mymachineserver 3000" et j'envoie ensuite du texte en validant par "Enter". Chaque ligne de texte est bien reçue par mon serveur.
    Maintenant, j'essaie de recevoir des infos depuis "ExtApp". La connexion se fait bien mais je ne reçois aucune information ensuite ???
    En cherchant dans la doc d'Indy, j'ai découvert la méthode "AContext.Connection.IOHandler.AllData". J'ai donc essayé cela et en effet, je parviens à voir les informations envoyées depuis "ExtApp". Mais l'utilisation de cette méthode étant complètement bloquante, j'ai dû chercher ailleurs (sur son fonctionnement interne en fait). J'ai donc implémenté ma méthode "Execute" de mon TIdTCPServer comme suit "AContext.Connection.IOHandler.CheckForDataOnSource;" puis "Line := AContext.Connection.IOHandler.InputBufferAsString;". Ceci marche à merveille avec "ExtApp".
    J'ai ensuite retester mon serveur comme au début avec "cmd.exe". Cela fonctionne toujours, mais les caractères sont récupérés les uns après les autres à la place de ligne à ligne (séparée par "Enter").
    Mes questions sont les suivantes :
    1. quelle est la différence entre ces 2 techniques ?
    2. y-a-t-il une possibilité de faire mieux ?
    3. la technique du "InputBufferAsString" peut-elle amener des problèmes sous-jacents ?
    MILLE MERCIS D'AVANCE.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Par défaut
    Maintenant, j'essaie de recevoir des infos depuis "ExtApp". La connexion se fait bien mais je ne reçois aucune information ensuite ???
    Si l'application n'envoie pas des trames terminées par des sauts de ligne, c'est normal. ReadLn() rends la main quand un saut de ligne est trouvé sur la connexion. Si tu connais le "bon" terminateur de ligne, il y a un ReadLn qui le prends comme premier paramètre, c'est peut-être ce que tu cherches.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2002
    Messages : 84
    Par défaut
    Bien vu, je vais voir cela au plus vite.
    Merci du tuyau.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2002
    Messages : 84
    Par défaut
    Et bien merci Reisubar, ce point là fonctionne bien.

    Si tu as un moment, peux-tu jeter un oeil au sujet nommé "TIdTCPServer / active:=false / application bloquée ?"

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

Discussions similaires

  1. Indy et Threads : Readln bloquant.
    Par AraXav dans le forum Langage
    Réponses: 4
    Dernier message: 05/05/2006, 11h26
  2. Readln
    Par Delph dans le forum Langage
    Réponses: 3
    Dernier message: 08/08/2002, 09h32
  3. Réponses: 3
    Dernier message: 26/07/2002, 23h02
  4. [Kylix] indy sur kylix? pb :-(
    Par NicoLinux dans le forum EDI
    Réponses: 7
    Dernier message: 15/05/2002, 23h32
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

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