是否可以使我的 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
是一个循环事件。它在连接的生命周期内持续触发。事件处理程序负责决定每次循环迭代要执行的操作,并提供适合所实现的通信协议(protocol)的任何必要的读/写逻辑。
在您的示例中,您所做的只是在每次循环迭代时编写一行文本,这就是您看到浏览器中出现无尽行的原因。您的事件处理程序逻辑需要比这更加结构化。这就是协议(protocol)的意义所在。在您的情况下,由于您正在与网络浏览器通信,因此您需要实现 HTTP protocol (这就是 TIdHTTPServer
为您所做的)。
关于delphi - Indy TCPServer OnExecute 模拟 HTTPServer OnCommandGet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24082880/