是否可以使我的TCPServer.OnExecute事件的行为与HTTPServer.OnCommandGet的行为相同:

procedure TMainForm.HttpServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  AResponseInfo.ResponseNo := 200;
  AResponseInfo.ContentType := 'text/plain';
  AResponseInfo.ContentText := 'Hello';
end;


我尝试了这个:

procedure TMainForm.TCPServerExecute(AContext: TIdContext);
begin
  AContext.Connection.IOHandler.WriteLn('Hello');
end;


但它会无限次向浏览器发送“ Hello”,直到我使服务器处于非活动状态。

最佳答案

TIdHTTPServer在从客户端读取完整的HTTP请求之前,不会触发OnCommand...事件。

您的TIdTCPServer根本没有读取任何请求。

TIdTCPServer.OnExecute是一个循环事件。在连接的生命周期内连续触发该事件。事件处理程序负责决定在每次循环迭代中要做什么,并提供适合于所实现的通信协议的任何必要的读/写逻辑。

在您的示例中,您要做的就是在每次循环迭代中写一行文本,这就是为什么您看到浏览器中出现无数行的原因。您的事件处理程序逻辑需要比此更加结构化。这就是协议的全部意义。在您的情况下,由于您正在与Web浏览器进行通信,因此需要实现HTTP protocol(这是TIdHTTPServer为您执行的操作)。

09-26 00:05