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

本文介绍使用INDY的IdMappedPortTCP控件实现动态HTTP代理服务器的方法。通过分析源代码,在OnExecute事件中根据用户请求更改代理主机,实现动态代理功能,并调整浏览器请求格式以确保正确访问不同网站。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者 : lxm365
标题 : 使用INDY的IdMappedPortTCP控件实现动态的HTTP代理服务器
关键字: INDY PROXY HTTP
分类 : 开发技巧
密级 : 参赛
 

(评分:★★★ , 回复: 11, 阅读: 2078)
  在工作中,需要一个时间控制条件非常复杂的代理服务器,因此只能自编。从网络中找到一些用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; //GetHost

2.获取端口号
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; //GetPort

3.删除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


 


2003-5-19 21:06:00

 
全部实例代码。目录如下: ToolBar工具栏控件使用 动态建立主菜单选项 窗口界面的动态分隔条 动态设置选项卡页面 在标题栏中自定义按钮 窗体开合窗帘效果 Windows XP界面效果 实现OutLook滚动工具栏效果 在下拉列表框中显示树形视图 自定义系统的About项 修改系统级菜单 实现透明窗体效果 爆破特技窗体 只允许建立一次子窗体的MDI程序 从外部DLL中调用子窗口 新颖的资源管理器界面 如何生成半圆形窗口 制作字幕滚动窗体 详解Canvas生成渐变色窗口背景 WINAPM风格磁化窗口 软件封面的图片显示制作 实现图片的任意角度旋转 奇妙的拼图游戏 使用PaintBox控件制作画图程序 使用DrawGrid控件制作五子棋 多彩的数据报表 按压缩比将BMP转换为JPG 16位真彩转换到256色 调整图片的RGB对比度 实现图像的灰度级处理效果 3种像素历遍方法的比较和实现 实现屏幕拷贝 实现图像漫游 4种幕布式图像显示技巧 盘旋法实现9种滤镜效果 图形朦胧叠合显示技巧 给MDI主窗体增加背景 实现图像的淡入淡出显示 多媒体播放器 播放AVI文件 根据客户端IP地址获取计算机名 实现多线程IP和DomainName相互转换 Windows2000下的Popup发送功能 如何实现Ping操作 实现多线程共享探测 实现Windows95/98的I/O端口读写 收发电子邮件与监视网络服务器资源 使用WebBrower制作浏览器 可视化的Ping工具 使用IdMappedPortTCP进行端口映射 动态设置ODBC数据源 用ADO控件打开Access数据库 DBGrid中的记录到Html页面的转换 在DBGrid中实现任意方向查找 在DBGrid中通过动态下拉列表查找记录 用DBGrid组件制作下拉列表形式的提示框 利用书签处理DBGrid中的多个记录 将ComboBox中的内容直接拖放到DBGrid里 如何在DBGrid里放置图标 DBGrid控件精彩组合 DBChart图表控件使用StringGrid组件中显示查询结果 使用流对象(Tstream)实现数据表中Tmemo字段的显示 如何动态建立SQLServer ODBC SQL浏览器 在SQL查询中使用动态参数 事务工作原理 标准/模糊查询 筛选数据 数据字典查看器 TDecisionGraph决策组件的使用 明细表(Master/Detail)结构 像处理文本资料一样处理数据表中的信息 远程数据库登录 远程数据库的离线处理 在远程数据库中实现主从表关系 动态设置远程数据库的查询参数 在远程数据库中计算统计值 多线程与数据库 使用远程存储过程 数据模块的同步显示 建立Web服务的数据提供端 建立Web服务的数据访问端 开发WebSnap数据库程序 建立ActiveForm数据浏览 建立数据查询WebServices服务器端 数据查询Web服务客户端开发 基于WAP的手机无线应用 建立基本Web数据库服务器应用 建立类型库编辑DataSnap服务端 建立查询条件Web数据库服务器应用 建立基本MTS服务端 建立MTS数据访问客户端 建立IntraWeb数据浏览 将程序图标设置到Windows系统托盘 取得和修改文件的创建和修改日期 通过流式数据实现文件分割与合并 实现指定扩展名文件和相应程序的关联 获取汉字拼音的首字母 监视剪贴板 在IE工具栏上增加一个按钮图标 软件注册机制的建立 复活节彩蛋的制作 SkinEngine控件——XP换肤 ActionList——应用程序通用功能列表 OleContainer——OLE容器 将程序项设置到控制面板 艺术化排列桌面图标 Delphi中的ini文件的读写 建立键盘鼠标动作记录与回放 实现指定目录下的文件查询 实现对系统的操作监视 系统级热键的实现 检测NumLock、Insert、CapsLock、ScrollLock键的状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值