是这样的
用INDY的IdHTTPServer控件,用于实现一个HTTP服务器
每有一个客户端连接,就触发了IdHTTPServer的OnCommandGet事件
在这个事件中,我可以给客户端应答发送数据等,做一些处理。
用窗体来实现,是完全没什么问题的现在的问题是,我想把这个HTTP服务器作为一个线程来用
也就是说,另外有一个主程序,在启动的时候创建一个IdHTTPServer的线程,专门用于应答客户端连接。那么,OnCommandGet事件,怎样才能写到一个线程里面去呢???
用INDY的IdHTTPServer控件,用于实现一个HTTP服务器
每有一个客户端连接,就触发了IdHTTPServer的OnCommandGet事件
在这个事件中,我可以给客户端应答发送数据等,做一些处理。
用窗体来实现,是完全没什么问题的现在的问题是,我想把这个HTTP服务器作为一个线程来用
也就是说,另外有一个主程序,在启动的时候创建一个IdHTTPServer的线程,专门用于应答客户端连接。那么,OnCommandGet事件,怎样才能写到一个线程里面去呢???
------------------------------------------------------------------------------------
1 这段代码应该写在什么地方?主程序中?线程的Execute或者Create方法中?
2 是否INDY的TIdHTTPServer控件只能在窗体中使用,而线程中是不能使用的?
IdHTTPServer.OnCommandGet:=YouFunc;其实可以一样的做成过程。完全跟form中使用一样的写一个处理过程然后在idhttpserver开始工作之前将这个过程赋值给IdHTTPServer.OnCommandGet,代码写在线程单元的execute中。2 是否INDY的TIdHTTPServer控件只能在窗体中使用,而线程中是不能使用的?不是的,就是上面那样使用就可以了~!
接分~
有可能是我不理解你的方法,你贴段可行的代码出来我看看吧,谢谢。
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”
这是一个服务器控件,这样写哪里错了?请指正,谢谢。
var test:Ttest;
begin
Test:=Ttest.Create(false);
.....然后执行,不过你这样创建线程,好像少了消息等待,不然线程执行就结束了!
end;
像你那样改了之后,可以连接一个客户端
但是一旦客户端断开连接就出错了
的确如你所说,少了消息等待,线程执行一次OnCommandGet就结束了
这应该怎么处理才好?