delphi - Indy TCPServer OnExecute 模拟 HTTPServer OnCommandGet

标签 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;

但它会无限次向浏览器发送“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/

相关文章:

c++ - 如何使用QTcpSocket(Qt4.7)读取完整数据

windows - Delphi:如何响应WM_SettingChange/WM_WinIniChange?

delphi - 通过互联网连接到 paradox db 的方法

php - Android 上的 idHTTP Not Acceptable 错误 406

delphi - Indy 10 + XE8 长文件名分段上传

PowerShell TCP 服务器

winapi - 如何使用 'C' 在 Windows 中查找可用的 TCP 端口

delphi - 如何等待命令行程序完成?

http - 在 TISAPIRequest 上添加自定义 header (Delphi 10.1 Datasnap 服务器)

delphi - 中继邮件时可以将服务器 SSL 证书附加到 TIdSMTPRelay 组件吗