Je sais, je pose beaucoup de questions ... mais comme un nouveau développeur de delphi je continue à tomber toutes ces questions :)Indy Ecrire Buffering/communication efficace TCP
Celui-ci traite de la communication TCP en utilisant indy 10. Pour rendre la communication efficace, je code une requête d'opération client sous la forme d'un seul octet (dans la plupart des scénarios suivis par d'autres octets de données bien sûr, mais dans ce cas un seul octet). Le problème est que
var Bytes : TBytes;
...
SetLength (Bytes, 1);
Bytes [0] := OpCode;
FConnection.IOHandler.Write (Bytes, 1);
ErrorCode := Connection.IOHandler.ReadByte;
n'envoie pas cet octet immédiatement (au moins le gestionnaire d'exécution des serveurs n'est pas appelé). Si je change le '1' en '9' par exemple tout fonctionne bien. Je suppose que Indy tamponne les octets sortants et essayé de désactiver tampon d'écriture avec
FConnection.IOHandler.WriteBufferClose;
mais il n'a pas aidé. Comment puis-je envoyer un seul octet et m'assurer qu'il est envoyé immédiatement? Et - j'ajoute une autre petite question ici - quelle est la meilleure façon d'envoyer un entier en utilisant indy? Malheureusement, je ne peux pas trouver la fonction comme WriteInteger dans le IOHandler de TIdTCPServer ... et
WriteLn (IntToStr (SomeIntVal))
me semble pas très efficace. Est-ce que cela fait une différence si j'utilise plusieurs commandes d'écriture dans une rangée ou si je rassemble des choses dans un tableau d'octets et que j'envoie une seule fois?
Merci pour toutes les réponses!
EDIT: J'ai ajouté une indication que j'utilise Indy 10 car il semble y avoir des changements majeurs concernant les procédures de lecture et d'écriture.
Notez que l'envoi de 1 octet n'est pas plus efficace que d'envoyer plus d'octets. Vous devriez probablement lire sur TCP/IP, la taille des paquets, les frais généraux de transfert et tout. Il y a une raison pour laquelle la plupart des anciens protocoles Internet utilisent du texte, même si la taille des données est plus grande qu'avec les données binaires. – mghie
Cette commande est une exception. La plupart des commandes ajoutent plus d'octets pour les paramètres de la commande. Je pensais que ça ne pouvait pas être mauvais d'emballer les choses le plus près possible. Ou ai-je tort ici? – jpfollenius
Tant que votre trame de données complète correspond à un paquet TCP, cela ne devrait pas faire beaucoup de différence. Les protocoles basés sur le texte OTOH sont d'une grande aide quand il s'agit de déboguer des choses. – mghie