TransWikia.com

Cliente e Servidor socket com Indy

Stack Overflow em Português Asked by Tonico Bittencourt on January 12, 2021

Caros,
estou tentando criar um programa que vai receber uma lista de produtos vendidos, através de uma conexão Socket.
Consigo conectar via TCPClient, porém não estou conseguindo enviar a lista de comandos, e nem receber o resultado que vem do server.
No meu teste, consigo receber uma linha, mas preciso receber várias linhas.
Estou fazendo assim:

procedure TForm1.Button4Click(Sender: TObject);
var
  LLine : string;
begin
  try
    if not IdTCPClient1.Connected then
      IdTCPClient1.Connect;

    IdTCPClient1.SendCmd(Edit3.Text);

    //LLine := IdTCPClient1.IOHandler.ReadLn();
    Lline := IdTCPClient1.Socket.ReadString(6000);
    mmLog.Lines.Add(LLine);

  except
  on E:Exception do
      if ( E.Message <> 'Connection Closed Gracefully.') then
        mmLog.Lines.Insert(0, 'ERROR: ' + E.Message);
  end;
end;

Estou usando Indy 10 e Delphi Tokio.

One Answer

Prefiro utilizar o componente socket padrão, mas para TIndy já utilizei da seguinte maneira:

Considerando que o servidor escreva linha a linha, basta informar na primeira linha a quantidade de linhas que esta sendo enviada.

procedure TFormulario.IdServidor1Execute(AContext: TIdContext);
begin
  AContext.Connection.IOHandler.WriteLn('3');
  AContext.Connection.IOHandler.WriteLn('MENSAGEM 1');
  AContext.Connection.IOHandler.WriteLn('MENSAGEM 2');
  AContext.Connection.IOHandler.WriteLn('MENSAGEM 3');
end;

Agora imagine que no cliente você já possui a solução. Ou seja, ao invés de utilizar ReadString utilize o ReadStrings que lhe devolvera uma lista de mensagens:

var
  i: Integer;
  vTexto: TStringList;
  vTamanho: Integer;
begin
  vTexto := TStringList.Create;

  vTamanho := IdTCPClient1.IOHandler.ReadLn.ToInteger;
  IdTCPClient1.IOHandler.ReadStrings(vTexto, vTamanho);

  for i := 0 to Pred(vTexto.Count) do
    Memo1.Lines.Add(vTexto[i]);
...

Neste caso, cabe uma pequena modificação no lado do Servidor para que ele sempre informe a quantidade de mensagens que esta enviando no pacote.

Answered by Junior Moreira on January 12, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP