Indy com lentidão

Delphi

21/06/2005

Aew... eu estou desenvolvendo uma aplicação onde eu envio 150 bytes atravez da rede. Meu programa funcionava perfeitamente com o delphi 5 e o component TSocket. Porem qdo eu migrei para o delphi 7 eu gostei mto da paleta Indy e a forma que os components de conexao trabalham!!! so estou tendo um probleminha: ao enviar esses 150 bytes (considero mto poucos bytes) a msg demora mais ou menos 10 segundos trabalhando com o ip 127.0.0.1 eu nem imagino o que aconteceria com um servidor com umas 1000 conexoes simultaneas! para o envio de ate 20 byte eh mto rapido. mais passou disso.

Eu faço da seguinte forma:

O cliente envia uma solicitação e espera a resposta e os dados:
idTCPClient1.WriteLn(#0); //onde 0 e o id da solicitacao
Buffer := idTCPClient1.ReadString(5);
Move(Buffer[1], vOperacao, 1);
Move(Buffer[2], LenBuffer, 4);
if vOperacao <> 0 then
  Abort;
Buffer := idTCPClient1.ReadString(LenBuffer); // Nessa linha que fica lento


e o servidor recebe no evento OnExecute e envia os dados pedidos:
AThread.Conections.WriteLn(#0 + LenBuffer + Buffer) // onde buffer eh os dados q eu envio


O codigo funciona perfeito mais na ultima linha demora uns 15 segundos.

Se alguem souber o que esta acontecendo por favor me ajude!


t+


Crash

Crash

Curtidas 0

Respostas

Massuda

Massuda

21/06/2005

Ao invés de usar WriteLn no servidor, experimente fazer o seguinte (não testei):
var
  Stream: TStringStream;
...
  Stream := TStringStream.Create(#0 + LenBuffer + Buffer)
  try
    with AThread.Conections do begin
      OpenWriteBuffer;
      try;
        WriteStream(Stream);
        CloseWriteBuffer;
      except
        CancelWriteBuffer;
        // talvez precise tratar o erro
      end;
    end;
  finally
    Stream.Free;
  end;
...
O OpenWriteBuffer/CloseWriteBuffer faz com que o buffer de saída seja transmitido imediatamente ao invés de ser bufferizado.


GOSTEI 0
POSTAR