是这样的
用INDY的IdHTTPServer控件,用于实现一个HTTP服务器
每有一个客户端连接,就触发了IdHTTPServer的OnCommandGet事件
在这个事件中,我可以给客户端应答发送数据等,做一些处理。
用窗体来实现,是完全没什么问题的现在的问题是,我想把这个HTTP服务器作为一个线程来用
也就是说,另外有一个主程序,在启动的时候创建一个IdHTTPServer的线程,专门用于应答客户端连接。那么,OnCommandGet事件,怎样才能写到一个线程里面去呢???

解决方案 »

  1.   

    把代码写在你自己定义的一个函数中,必须与oncommandget的函数一致,如YouFunc,然后用:IdHTTPServer.OnCommandGet:=YouFunc;
      

  2.   

    把代码写在你自己定义的一个函数中,必须与oncommandget的函数一致,如YouFunc,然后用:IdHTTPServer.OnCommandGet:=YouFunc;
    ------------------------------------------------------------------------------------
    1 这段代码应该写在什么地方?主程序中?线程的Execute或者Create方法中?
    2 是否INDY的TIdHTTPServer控件只能在窗体中使用,而线程中是不能使用的?
      

  3.   

    没有问题的你首先需要把idhttpserver所需要用到的单元全部引用进去。然后复制IdHTTPServer的OnCommandGet过程的全部参数格式到线程单元。就如这位兄弟所说
    IdHTTPServer.OnCommandGet:=YouFunc;其实可以一样的做成过程。完全跟form中使用一样的写一个处理过程然后在idhttpserver开始工作之前将这个过程赋值给IdHTTPServer.OnCommandGet,代码写在线程单元的execute中。2 是否INDY的TIdHTTPServer控件只能在窗体中使用,而线程中是不能使用的?不是的,就是上面那样使用就可以了~!
    接分~
      

  4.   

    zhhf1025(易凡) ,不知道你是否做过实验?你的那种方法我测试过,不行
    有可能是我不理解你的方法,你贴段可行的代码出来我看看吧,谢谢。
      

  5.   

    请看这帖……昨天我刚遇见的http://community.csdn.net/Expert/topic/5337/5337121.xml?temp=.4690515
      

  6.   

    -----------线程单元---------------
    unit Unit2;interfaceuses
      Classes,IdBaseComponent, IdComponent, IdTCPServer, IdCustomHTTPServer,
      IdHTTPServer,IdSocketHandle;type
      Ttest = class(TThread)
      private
        HTTPServer: TIdHTTPServer;
      protected
        procedure Execute; override;
        procedure HTTPServerCommandGet(AThread: TIdPeerThread;
           ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
      public
      end;implementationprocedure Ttest.Execute;
    var Binding : TIdSocketHandle;
    begin
      HTTPServer:=TIdHTTPServer.Create(nil);
      HTTPServer.Bindings.Clear;
      Binding := HTTPServer.Bindings.Add;
      Binding.Port :=80;                   //绑定80端口
      Binding.IP :='127.0.0.1' ;           //绑定IP
      HTTPServer.Active:=true;
      HTTPServer.KeepAlive:=true;
      HTTPServer.OnCommandGet:=HTTPServerCommandGet;
    end;procedure Ttest.HTTPServerCommandGet(AThread: TIdPeerThread;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    var s:string;
    begin
       s:=ARequestInfo.RawHTTPCommand;  //得到客户端HTTP头
       AResponseInfo.ContentText:=s;    //返回HTTP头的内容给浏览器
    end;end.---------------
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,Unit2, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
    procedure TForm1.Button1Click(Sender: TObject);
    var  test:Ttest;
    begin
       test.Create(false);
    end;end.
    --------------------------------我的代码如上,但是依然没有效果。
    因为该HTTP服务器监听的是本机(127.0.0.1)的80端口
    所以按道理说,在浏览器器中键入 http://127.0.0.1,
    页面应该显示如下内容才正确“GET / HTTP/1.1”
    这是一个服务器控件,这样写哪里错了?请指正,谢谢。
      

  7.   

    procedure TForm1.Button1Click(Sender: TObject);
    var  test:Ttest;
    begin
       Test:=Ttest.Create(false);
       .....然后执行,不过你这样创建线程,好像少了消息等待,不然线程执行就结束了!
    end;
      

  8.   

    多谢上面的各位了,多谢lxtnt,的确我的代码有点问题
    像你那样改了之后,可以连接一个客户端
    但是一旦客户端断开连接就出错了
    的确如你所说,少了消息等待,线程执行一次OnCommandGet就结束了
    这应该怎么处理才好?
      

  9.   

    哦,原来是HTTPServer.KeepAlive:=true;引起的错误,多谢各位,接分!