Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Problema con TIdTCPClient (https://www.clubdelphi.com/foros/showthread.php?t=31561)

liadsoft 11-05-2006 09:35:01

Problema con TIdTCPClient
 
Bueno, yo hice un proxy utilizando el TIdTCPClient para conectarme con la página que me pedía el explorador a través de un TIdTCPServer.

El problema que tengo es el siguiente. En el encabezado que me devuelve la página, muchas veces me dice el Content-Length, en tal caso yo leo de kilobyte en kilo desde el TIdTCPClient hasta llegar a la longitud dada (por supuesto que leo el mod que me queda {resto}). Pero cuando la página no me envía la longitud del cuerpo del mensage tengo que leer hasta que se desconecte.

Pero el problema, es que como es una aplicación que va a estar en la misma máquina donde está el Browser, no puedo bajar todo el archivo y después enviarselo al Internet Explorer, por ejemplo, porque si no este pincha un poco lento y eso. Entonces, en ese caso leo byte a byte con ReadString(1), un byte en este caso. Pero no s[e por qué el componente después de leer todos los bytes, se queda en la función y no vuelve, trabandome el Thread con el que estoy trabajando.

Ya, antes de leer el byte le pongo que compruebe si está conectado o no, pero aun así sigue trabandose. Pleas, si alguien me puede ayudar....

waltergomez 11-05-2006 17:06:37

Si pones el codigo que usas es mas facil darte una mano.

Saludos,

liadsoft 12-05-2006 08:39:52

Código
 
Cita:

Empezado por waltergomez
Si pones el codigo que usas es mas facil darte una mano.

Saludos,

Primero le asigno a la instancia del TIdTCPServer, en el evento OnConnect el procedimiento ProxServConnect. Cada vez que algún programa se conecte al servidor por el puerto en el que está escuchando, se ejecutará ese procediemiento.

Al procedimiento se le pasa el objeto AThread del tipo TIdPeerThread.

Al conectarse algún programa, leo el header del request:

str:=AThread.Connection.ReadLn(#13#10#13#10,5000);

En el procedimiento creo al objeto que va a conectarse a la página pedida

var
Client: TIdTCPClient

(...)

Client:=TIdTCPClient.Create(nil);

Luego envío el request, que si tiene cuerpo, también lo envío.

Después, leo el header (encabezado) de la repuesto

str:=Client.ReadLn(#13#10#13#10,15000);

Con una función obtengo si existe el campo Content-Length y si es así la función me devuelve la longitud del cuerpo del mensage:

l:=GetContentLength(str);

If l>0 then begin
//Aquí no hay problema
end else begin
//Aquí es el problema

repeat
Client.CheckForDisconnect(false);
If not Client.Connected then Break;

//Aquí es donde se queda trabado
str:=Client.ReadString(1);

repeat try
AThread.Connection.Write(str);
blRepeat:=false;

except
blRepeat:=false;
AThread.Connection.CheckforDisconnect;
If not ATHread.Connection.Connected then raise;
end;
until not blRepeat;

until not Client.Connected;

end;


Bueno, espero que me puedan ayudar. Gracias por todo.


La franja horaria es GMT +2. Ahora son las 09:47:38.

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