今天,我在使用 Indy 10(随 Delphi 2010 提供)时遇到了一个奇怪的行为。这是问题所在:
假设我们的客户端中有一个 IdTcpClient,我们的服务器应用程序中有一个 IdTcpServer,并且我们的 IdTcpServer 的 OnExecute 事件处理程序中的这段代码:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
AStream: TStringStream;
S: string;
begin
AStream := TStringStream.Create;
try
AContext.Connection.IOHandler.ReadStream(AStream);
S := AStream.DataString;
finally
AStream.Free;
end;
end;
现在,当客户端尝试连接到服务器时,使用 TIdTcpClient.Connect;在服务器上,调用 TIdTcpServer.OnExecute,当执行到达 AContext.Connection.IOHandler.ReadStream(AStream) 行时,在 OnExecute 事件处理程序中运行的线程被阻塞!
当我跟踪代码时,问题是在 ReadStream 中调用 ReadLongInt 以获取字节数引起的。ReadLongInt 调用 ReadBytes。在 ReadBytes 中,FInputBuffer.Size 为零。在那里,在一个循环中调用 ReadFromSource,最终执行到达 TIdSocketListWindows.FDSelect,它从 WinSock2 调用“select”函数,并且执行在这里停止,并且不会从该客户端连接接收任何内容。我也尝试为 AByteCount 和 AReadUntilDisconnect 参数赋值,但它并没有改变行为。
如果我将 ReadStream 替换为 ReadLn,则连接到服务器不会阻止代码执行,并且从客户端发送的数据由服务器读取。
代码有什么问题吗?或者这是一个错误?
问候