\t\t使用INDY的IdMappedPortTCP控件实现动态的HTTP代理服务器

发布时间:2014-10-22 13:34:21编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"\t\t使用INDY的IdMappedPortTCP控件实现动态的HTTP代理服务器",主要涉及到\t\t使用INDY的IdMappedPortTCP控件实现动态的HTTP代理服务器方面的内容,对于\t\t使用INDY的IdMappedPortTCP控件实现动态的HTTP代理服务器感兴趣的同学可以参考一下。

在工作中,需要一个时间控制条件非常复杂的代理服务器,因此只能自编。从网络中找到一些用ServerSocket和ClientSocket开发的代理服务器源代码,比较复杂。因此想用INDY控件组中的IdMappedPortTC开发代理服务器。DELPHI附带例子演示的是一个静态的代理,比如例中的www.borland.com,而实际应用中需要的却一个动态的代理。本文即介绍如何使用INDY的IdMappedPortTCP控件实现动态的HTTP代理服务器     分析INDY9所带的源代码,发现NETDATA属性中了存放用户的请求内容和服务器的回复信息,OnExecute事件是在接收到用户请求后与向WEB服务器转发请求之前执行的。因此可以在OnExecute事件写些根据用户的请求更改代理主机的代码,这样就可实现动态代理。代码如下:procedure TForm1.IdMappedPortTCP1Execute(AThread: TIdMappedPortThread);var   RequestHost:string;   RequestPort:integer;begin   //改变连接   IDLock.Acquire;   try     RequestHost:=GetHost(AThread.NetData);     RequestPort:=GetPort(AThread.NetData);     if (RequestHost<>IdMappedPortTcp1.MappedHost) or       (RequestPort<>IdMappedPortTcp1.MappedPort) then     begin       IdMappedPortTCP1.MappedHost:=RequestHost;       IdMappedPortTCP1.MappedPort:=RequestPort;       TidTcpClient(AThread.OutboundClient).Host:=RequestHost;       TidTcpClient(AThread.OutboundClient).Port:=RequestPort;       TidTcpClient(AThread.OutboundClient).Disconnect;       TidTcpClient(AThread.OutboundClient).Connect(AThread.ConnectTimeOut);     end;   //ChangeConnect   finally     IDLock.Release;   end;end;    实际应用中,访问www.163.com和www.sina.com.cn网站会出现错误,经分析发现需对浏览器的请求格式作些调整,即删除GET请求中的主机名。 在该事件中再加一行改变请求的代码,如下:    //改变请求    AThread.NetData:=DelHostOfURL(AThread.NetData,RequestHost,RequestPort);    上述方法实现HTTP代理服务器非常简单,不信你试试。本次工作的一个重要体会就是分析源代码比看手册资料更有效。    砍死微软,开放源代码万岁!附:本程序所需的三个自定义函数的代码。1.获取主机名function TForm1.GetHost(URL: string):string;var   LURI:TIdURI;begin   LURI:=TIdURI.Create(URL);   result:=LURI.Host;   LURI.Free;end;   //GetHost2.获取端口号function TForm1.GetPort(URL: string):integer;var   LURI:TIdURI;begin   LURI:=TIdURI.Create(URL);   if Length(LURI.Port)<>0 then     result:=StrToInt(LURI.Port)   else     result:=80;   LURI.Free;end;   //GetPort3.删除URL中的HOST字符串function TForm1.DelHostOfURL(URL,Host:string;Port:integer):string;var   s:string;begin   result:= URL;   s:='http://'+Host;   if Port <> 80 then     s:= s + ':' + IntToStr(Port);   Delete(result,pos(s,result),length(s));end;   //DelHostOfURL


上一篇:HashMap的实现原理
下一篇:2011年6月20日

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款