Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TIdTCPClient - Conocer cuanto hay en el bufer. (https://www.clubdelphi.com/foros/showthread.php?t=67660)

jplj 28-04-2010 21:19:51

TIdTCPClient - Conocer cuanto hay en el bufer.
 
Hola:

Tengo algo similar a:
Código Delphi [-]
... FClient:= TIdTCPClient; ... // En el Execute de un Hilo while FClient.InputBuffer.Size > 0 begin
FClient.ReadStream(FStream, x); ...
end; ...

Lo que pretendo es ir leyendo fragmentos del bufer.
En primer lugar consulto si hay datos con InputBuffer.Size, pero siempre me devuelve 0 la primera vez, sin embargo si hago una lectura previa de, por ejemplo 1 byte, si me devuelve un valor correcto.

Realizo una comprobación previa con InputBuffer.Size, porque si realizo una lectura sobre un bufer que esté vacío, se produce una excepción y se cierra el cliente, cosa que quiero impedir.

Uso Delphi 7 / Indy 9

Muchas gracias de antemano.

manuc 30-04-2010 07:36:18

Hola jplj,

La verdad es que entiendo bien lo que planteas.


Lo que puedes hacer es enviar un paquete al servidor, que este lo interprete y retorne otro paquete al cliente.

En Indy9, una de las estructuras lógica para hacerlo sería esta:

Servidor:
Código Delphi [-]
procedure TConexiones.idTCPServer(AThread: TIdPeerThread);
var
aStream:TMemoryStream;
begin
try
 if not AThread.Terminated and AThread.Connection.Connected then
    begin
    aStream := TMemoryStream.Create;
    AThread.Connection.ReadStream(aStream,-1,false);

    //Aquí Con aStream haces lo que quieras

    //Aquí retornas la respuesta; En este caso, contenida en un stream
     aThread.Connection.OpenWriteBuffer;
     aThread.Connection.WriteStream(aStream,true,true,aStream.Size);
     aThread.Connection.CloseWriteBuffer;

    FreeAndNil(aStream);
Except; 

end;//end-try

Estructura Cliente:

Código Delphi [-]
 TCPClient.WriteStream(aStream,true,true,aStream.Size); //Enviamos el paquete al servidor
 fTCPClient.ReadStream(fmsStream,-1); //Leemos la respuesta del servidor

Espero que te ayude.

Un saludo.


La franja horaria es GMT +2. Ahora son las 09:58:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi