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.
Partager