2016-10-28 3 views
0

J'utilise XE7 et la conversion d'une application de l'utilisation des composants ScktComp à Indy, en utilisant TIdTCPClient à la place de TClientSocket. À l'heure actuelle, je ne fais que mettre des équivalents probables pour le compiler. La majeure partie a été convertie, à l'exception de cet extrait:Conversion de TClientSocket en Indy: qu'est-ce qui est équivalent à ReceiveLength?

if (Socket.ReceiveLength > 0) then 
begin 
    s := Socket.ReceiveText; 

que je l'ai converti en

s := Socket.IOHandler.ReadLn 

Je ne équivalent ReceiveLength.

Des idées?

Répondre

1

IOHandler.ReadLn() est pas l'équivalent correct de ReceiveText().

ReceiveLength() renvoie le nombre non lu octets qui se trouvent actuellement dans le tampon du socket. ReceiveText() lit simplement tous les octets bruts sont actuellement dans le tampon du socket et les renvoie dans une variable string. C'est un wrapper pour un seul appel à ReceiveBuf() en utilisant ReceiveLength() comme taille de la mémoire tampon.

IOHandler.ReadLn() lit du tampon propre mémoire de IOHandler, peuplant octets de mémoire tampon de la prise, au besoin, jusqu'à ce qu'il rencontre la terminaison spécifiée (ce qui est un caractère LF par défaut), peu importe combien de lectures qu'il faut pour accomplir cette .

Il n'y a pas de traduction directe de ReceiveLength() à Indy, mais le plus proche équivalent à votre extrait serait d'appeler IOHandler.CheckForDataOnSource() suivie IOHandler.InputBufferAsString(), par exemple:

Socket.CheckForDataOnSource(0); 
if not Socket.InputBufferIsEmpty then 
begin 
    s := Socket.InputBufferAsString; 

Vous pouvez IOHandler.ReadBytes() avec son paramètre AByteCount réglé sur -1, puis convertir le tableau d'octets retourné à une chaîne:

buf := nil; 
Socket.ReadBytes(buf, -1); 
if buf <> nil then 
begin 
    s := BytesToString(buf); 

Cela étant dit, je dois vous demander pourquoi vous utilisez dans ReceiveText() la première place. Il renvoie une chaîne de arbitraire octets, de sorte qu'il ne se prête pas vraiment bien à la plupart des besoins de communication, peut casser des données textuelles de manière imprévisible et ne convient pas du tout aux données binaires. Les protocoles de réseau ont généralement une structure pour eux, et l'utilisation de TClientSocket nécessite généralement du code pour tamponner manuellement les octets et analyser les données structurées à partir de ce tampon - choses que Indy est conçu pour gérer pour vous. Vous devriez vous concentrer davantage sur l'objectif que vous voulez atteindre et moins sur les détails de la façon de l'obtenir. Si vous avez besoin de lire un entier, demandez à Indy de lire un entier. Si vous devez lire une chaîne d'une longueur particulière ou se terminant par un délimiteur particulier, demandez à Indy de lire une chaîne. Si vous avez besoin de lire un bloc de X octets, demandez à Indy de lire X octets. Indy dispose de nombreuses méthodes de lecture/écriture pour automatiser les tâches courantes que vous auriez normalement à effectuer manuellement.