Indy TCPServer OnExecute模拟HTTPServer OnCommandGet

时间:2014-06-06 13:20:05

标签: delphi indy tcpserver

是否可以使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;到浏览器无限次,直到我使服务器处于非活动状态。

2 个答案:

答案 0 :(得分:1)

在TCP连接期间,循环调用execute方法。这对于服务器推送应用程序是可以的(除了应该限制消息发送以避免服务器过载)。

如果要实现请求/回复协议,请从ReadLn(或与您的协议匹配的任何其他Read方法)开始。这将阻止执行,直到客户端发送请求为止。

答案 1 :(得分:1)

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

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

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

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