是否可以使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;
但是它发送了“你好”#39;到浏览器无限次,直到我使服务器处于非活动状态。
答案 0 :(得分:1)
在TCP连接期间,循环调用execute方法。这对于服务器推送应用程序是可以的(除了应该限制消息发送以避免服务器过载)。
如果要实现请求/回复协议,请从ReadLn(或与您的协议匹配的任何其他Read方法)开始。这将阻止执行,直到客户端发送请求为止。
答案 1 :(得分:1)
TIdHTTPServer
在从客户端读取完整的HTTP请求之前不会触发OnCommand...
事件。
您的TIdTCPServer
根本没有阅读任何请求。
TIdTCPServer.OnExecute
是一个循环事件。它在连接的生命周期内持续触发。事件处理程序负责决定在每次循环迭代中做什么,并提供适合于正在实现的通信协议的任何必要的读/写逻辑。
在您的示例中,您所做的只是在每次循环迭代中编写一行文本,这就是您在浏览器中看到无穷无尽的行的原因。您的事件处理程序逻辑需要更加结构化。这就是协议的全部内容。在您的情况下,由于您正在与Web浏览器进行通信,因此您需要实现HTTP protocol(这是TIdHTTPServer
为您所做的事情)。