【发布时间】:2021-12-12 03:01:20
【问题描述】:
我有一个应用程序从另一个应用程序接收 TCP 套接字连接,处理通过套接字流式传输的内容,根据接收到的数据构建请求,使用 TIdHTTP 将请求发送到外部服务器,处理响应,并将 ack 发送回 tcp 客户端。
procedure TMyClass.TCPExecute(AContext: TIdContext);
var
s: AnsiString;
begin
s := TransferTCPBytesToString(AContext.Connection.IOHandler);
// test string for terminating characters
if Pos(#28#13, s) > 0 then
begin
//********PROBLEM: THIS WILL BE CALLED MULTIPLE TIMES
//********WITH THE SAME COMPLETE DATA STREAM CONTENT!
BuildAndSendExternalRequest(s);
AContext.Connection.IOHandler.InputBuffer.Clear;
// send the response back to tcp client
WriteTCPResponse(AContext.Connection.IOHandler);
end;
end;
function TMyClass.TransferTCPBytesToString(AnIOHandler: TIdIOHandler): AnsiString;
begin
if AnIOHandler.InputBufferIsEmpty then
Exit;
// read message from tcp client connection
AnIOHandler.ReadBytes(FTCPBytes, AnIOHandler.InputBuffer.Size, True);
SetLength(Result, Length(FTCPBytes));
// copy message bytes to string
Move(FTCPBytes[0], Result[1], Length(FTCPBytes));
end;
procedure TMyClass.WriteTCPResponse(AnIOHandler: TIdIOHandler);
var
bytes: TBytes;
begin
// FTCPBytes contains data from tcp client
// bytes will contain processed response from external server
BuildACK(FTCPBytes,bytes);
// FTCPBytes now contains ACK data
AnIOHandler.WriteDirect(FTCPBytes, Length(FTCPBytes));
end;
请求/响应周期成功完成;发送回 tcp 客户端请求者的响应是正确的,进程按预期执行和完成。
但是,由于 OnExecute 事件会使用相同的数据多次触发,因此会接收、构建、发送、确认两个请求等。
在查看 tcp 客户端应用程序上的日志时,日志仅显示正在发送的一个请求。不知道这里发生了什么。但我需要确保请求/响应周期是 1-1,而不是 1-many!
谢谢。
【问题讨论】: