【问题标题】:Read TStream data in thread with Indy使用 Indy 在线程中读取流数据
【发布时间】:2015-02-07 08:43:39
【问题描述】:

创建将使用 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;

【问题讨论】:

  • @iPath ツ:这段代码是客户端TIdTCPClient 不是螺纹组件,所以需要手动螺纹。你正在考虑TIdTCPServer
  • @RemyLebeau 我误读了这个问题。感谢您的提示。我的评论被删除了。

标签: multithreading delphi delphi-7 indy indy10


【解决方案1】:

您显示的代码是可以的,前提是每个 TCP 消息前面都有一个 Int64,按照网络字节顺序,指定消息的大小,正如您所说的 ReadStream()通过设置LargeStream=TrueAByteCount=-1AReadUntilDisconnect=False 来读取。它将读取 8 个字节并将它们解释为 Int64,然后读取 Int64 表示的任意多个字节。

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

如果您需要更多帮助,您需要展示 TCP 消息的实际外观。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多