使用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;
答案 0 :(得分:2)
您显示的代码是正常的,前提是每个TCP消息都是,前面是Int64,按网络字节顺序,指定消息的大小,因为这就是您所说的{{1通过设置ReadStream()
,LargeStream=True
和AByteCount=-1
进行阅读。它将读取8个字节并将它们解释为Int64,然后读取Int64所说的许多字节。
由于您未提供有关实际TCP协议的任何详细信息,因此没有人可以告诉您是否正在正确读取TCP消息。您说AReadUntilDisconnect=False
上有错误,但您没有说明错误实际是什么。但是您收到错误的事实表明TCP消息的格式不是ReadStream()
所期望的。
如果您需要更多帮助,则需要显示TCP消息的实际内容。