Delphi Indy TCPServer OneExecute模拟HTTPServer OnCommandGet

Delphi Indy TCPServer OneExecute模拟HTTPServer OnCommandGet,delphi,indy,tcpserver,Delphi,Indy,Tcpserver,是否可以使myTCPServer.OneExecute事件的行为方式与HTTPServer.OnCommandGet的行为方式相同: procedure TMainForm.HttpServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); begin AResponseInfo.ResponseNo := 200; ARes

是否可以使my
TCPServer.OneExecute
事件的行为方式与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”,直到我使服务器处于非活动状态。

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


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

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

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

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


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

您能否提供一个示例,因为
AContext.Connection.IOHandler.ReadLn;AContext.Connection.IOHandler.WriteLn('Hello')向浏览器发送7次“Hello”,这是在我使我的
TCPServer
处于非活动状态之后。如果
ReadLn
没有读取任何数据,它将返回一个空字符串。你查过这个了吗?如果它返回一个空字符串,这意味着它在客户端发送数据之前超时。在这种情况下,不要发回响应。@Roman_Bezjak:web浏览器将使用与您的
TIdTCPServer
进行通信,该浏览器的请求头中包含几行文本。这就是您的
ReadLn()
调用得到满足的原因,并且
OnExecute
将继续循环,直到没有更多的行可读取为止。因此,如果您看到7个Hello,浏览器的请求必须在其标题中包含7行。@mjn:
ReadLn()
只有在超时时才会在失败时返回一个空行,在这种情况下,它会在退出之前将
ReadLnTimedOut
属性设置为true。默认情况下,Indy使用无限超时,因此您必须将
ReadTimeout
属性设置为其他属性,或者将超时作为输入参数直接传递给
ReadLn()