如何在控制台应用程序中创建indy HTTPServer

时间:2014-11-25 01:33:56

标签: delphi indy httpserver

我正在尝试使用Delphi 7 / indy(9)组件(控制台应用程序,没有表单/应用程序)来执行HttpServer:

更新:具有无限循环的完整控制台示例。

program httpserver;
{$APPTYPE CONSOLE}

uses
  IdHTTPServer, IdTCPServer, IdCustomHTTPServer;

Type
  TCommandHandler= class
  protected
    procedure DoCommandGet(AThread: TIdPeerThread;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);

end;

{$R *.res}
var Server:TIdHTTPServer ;
CH:TCommandHandler;


procedure TCommandHandler.DoCommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
   AResponseInfo.ResponseText := '1234';
end;

begin
  Server := TIdHTTPServer.Create(nil);
  CH := TCommandHandler.Create;
  Server.OnCommandGet :=CH.DoCommandGet;
  Server.DefaultPort := 3030;
  Server.Active := True;
  while true do ;
end.

但不起作用!我阅读了indy的源代码并在google上搜索但没有成功。

更新:

  1. 没有循环,程序结束(当然......)
  2. 使用循环,响应非常奇怪。(状态代码的连接 - 确定+响应) http://www.image-share.com/upload/2766/294.png
  3. 使用表单,响应正常。 http://www.image-share.com/upload/2766/295.png
  4. 也许是indy的错误/限制...

2 个答案:

答案 0 :(得分:3)

您在AResponseInfo中设置了错误的成员。 您必须使用ContentText而不是ResponseText(将在您发现的ResponseCode之后写入)

program httpserver;
{$APPTYPE CONSOLE}

uses
  IdHTTPServer, IdTCPServer, IdCustomHTTPServer;

Type
  TCommandHandler= class
  protected
    procedure DoCommandGet(AThread: TIdPeerThread;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);

end;

{$R *.res}
var Server:TIdHTTPServer ;
CH:TCommandHandler;


procedure TCommandHandler.DoCommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  AResponseInfo.ContentText := '1234';
  AResponseInfo.ContentType := 'text/plain';
end;

begin
  Server := TIdHTTPServer.Create(nil);
  CH := TCommandHandler.Create;
  Server.OnCommandGet :=CH.DoCommandGet;
  Server.DefaultPort := 3030;
  Server.Active := True;
  Readln;
end.

答案 1 :(得分:0)

嗨,你需要做一个无限循环,并注意关闭一些组合。

program  httpserver;
{$APPTYPE CONSOLE}

uses idHTTPServer;


var 
  Server: TidHTTPServer;
begin
  Server := TidHTTPServer.Create();
  Server.DefaultPort := 3030;
  Server.Active := True;

  repeat
    //DO SOMETHING
  until (Break some how);
end;

所以应用程序永远不会结束,在delphi上使用命令application.run为windows消息启动一个内部循环。

其他问题,需要为TidHTTPServer组件上的事件添加代码