是否可以使我的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
为您执行的操作)。