使用Indy读取线程中的流数据

时间:2015-02-07 08:43:39

标签: multithreading delphi delphi-7 indy indy10

使用IdTCPClient1创建读取接收数据的线程的正确方法是什么?并且所有数据都是TStream或Tmemorystream形式。

我试过了:

constructor TReadResponse.Create(AConn: TIdTCPConnection);
begin
  FConn := AConn;
  inherited Create(False);
end;

procedure TReadResponse.Execute;
var
  RcvStrMem : TMemoryStream;
begin
  while not Terminated and FConn.Connected do
  begin
    try
      RcvStrMem := TMemoryStream.Create;
      FConn.IOHandler.LargeStream := True;
      FConn.IOHandler.ReadStream(RcvStrMem, -1, False);//error here ??
      //MessageBox(0, pChar(inttostr(RcvStrMem.Size)), 0, 0);
      TWriteResponse.AddResponse(RcvStrMem);

    finally
      RcvStrMem.Free;
    end;
  end;
end;

WriteResponse线程

class procedure TWriteResponse.AddResponse (AResponse: TStream);
begin
  with Create(AResponse) do try
  Synchronize;

  finally
    Free;
  end;
end;

procedure TWriteResponse.DoSynchronize;
begin
 //do something
end;

以下是我在Form1中执行线程的方法:

var
    rr:   TReadResponse = nil;
......
procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
 rr:=  TReadResponse.Create(IdTCPClient1);
end;

1 个答案:

答案 0 :(得分:2)

您显示的代码是正常的,前提是每个TCP消息都是,前面是Int64,按网络字节顺序,指定消息的大小,因为这就是您所说的{{1通过设置ReadStream()LargeStream=TrueAByteCount=-1进行阅读。它将读取8个字节并将它们解释为Int64,然后读取Int64所说的许多字节。

由于您未提供有关实际TCP协议的任何详细信息,因此没有人可以告诉您是否正在正确读取TCP消息。您说AReadUntilDisconnect=False上有错误,但您没有说明错误实际是什么。但是您收到错误的事实表明TCP消息的格式不是ReadStream()所期望的。

如果您需要更多帮助,则需要显示TCP消息的实际内容。