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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
作者 : 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

 
delphi编写的端口转发,端口映射的例子 delphi编写的端口转发,端口映射的例子 使用IdMappedPortTCP 立即下载

相关推荐

indy HTTP实例

indy HTTP实例 delphi delphi6,7 indy HTTP实例

Delphi7的Indy控件IdMappedPortTcpHTTP代理程序

很多朋友一定象我一样需要一个可以自己定制的HTTP代理程序,受到论坛里面的LXM365朋友的启发(在此感谢一下!),发现利用DELPHI7 的INDY控件IdMappedPortTcp可以做成HTTP代理程序.于是我仔细查看了一下IdMappedPortTcp的源代码,发现Lxm365在OnExecute事件里面处理的方案并不完美,因为在触发OnExecute事件前代理程序必须已经连接到一个目标机

编程资料收集与共享交流 3390

IdMappedPortTCP做的端口加密转发

IdMappedPortTCP做的端口加密转发,可以实现数据加密端口转发。

公布Oracle端口映射源码,并加以例程说明,方便大家使用,不能用于黑客目的哈

从这里到end. 为一个单元,可以copy到delphi中保存{----------------------------------------------------------------------------- Unit Name: IdMappedOra Author:    LCK---------------------------------------------------

科长的共享专栏 2085

C++ Builder下端口映射服务器的开发与研究(更新版)

(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。) 一、业务需求      端口映射即网络代理,其功能与路由器等网络设备基本类似,常用的软件代理也很多,但是如何自己动手开发一个端口映射代理呢?比如某银行的外联业务

路在脚下 1736

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

在工作中,需要一个时间控制条件非常复杂的代理服务器,因此只能自编。从网络中找到一些用ServerSocket和ClientSocket开发的代理服务器源代码,比较复杂。因此想用INDY控件组中的IdMappedPortTC开发代理服务器DELPHI附带例子演示的是一个静态的代理,比如例中的www.borland.com,而实际应用中需要的却一个动态代理。本文即介绍如何使用INDY的IdMapp

505

组建映射

package org.hibernate.demo.entity; import java.io.Serializable; public class Husband implements Serializable { private Integer id; private String name; private Wife wife; public Integer get

mexican_jacky的专栏 346

Indy10中IdMappedPortTCP的用法

  Indy10把参数由AThread换成AContext后,用法已经不同.OnConnect中获取来源IPAContext.Connection.Socket.Binding.PeerIP;OnExecute中处理客户端来的数据VaraThread:TIdMappedPortContext;s:string;begin   aThread:=TIdMappedPortContext(aCont...

weixin_34319111的博客 515

服务器XE,D7安装控件情况

213XE2     213D7

hrdzkj的专栏 586

Delphi7 编程 100 实例

ToolBar工具栏控件使用动态建立主菜单选项窗口界面的动态分隔条动态设置选项卡页面在标题栏中自定义按钮窗体开合窗帘效果Windows XP界面效果实现OutLook滚动工具栏效果在下拉列表框中显示树形视图自定义系统的About项修改系统级菜单实现透明窗体效果爆破特技窗体只允许建立一次子窗体的MDI程序从外部DLL中调用子窗口新颖的资源管理器界面如何生成半圆形窗口制作字幕滚动窗体详解Canvas生成渐变色窗口背景WINAPM风格磁化窗口软件封面的图片显示制作实现图片的任意角度旋转奇妙的拼图游戏使用PaintBox控件制作画图程序使用DrawGrid控件制作五子棋多彩的数据报表按压缩比将BMP转换为JPG16位真彩转换到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 ODBCSQL浏览器在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键的状态

端口映射2.0 用Delphi控件编写

上一个版本的改进版,代码进行缩减,更紧凑,运行更稳定

Delphi编程100例

全部实例代码。目录如下: 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键的状态

indy 封包转发

type  TMySuperMappedPortContext = Class(TIdMappedPortContext)    public      procedure DoEncode;      procedure DoDecode;  End;implementation{自定义加密函数}function EncodeData(Src: String): String;begin  Re...

weixin_33744854的博客 145

基于TCP的Socket连接【Delphi版】

一、Server端 使用indy控件: idtcpsrvr1: TIdTCPServer; a)设置默认端口 1 begin2 Self.btn1.Enabled:=False;3 idtcpsrvr1.DefaultPort:=2001;4 idtcpsrvr1.Active:=True;5 end; b)对客户端连接事件响应 ...

weixin_33781606的博客 707

HTTP请求方式中8种请求方法(简单介绍)

HTTP请求方式中8种请求方法(简单介绍) 简单介绍 HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范。HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是动态分配的。当我们没有指定端口访问时,浏览器会默认帮我们添加80端口。我们也可以自己指定访问端口如:http://www.ip138.com:80。 需...

weixin_42981419的博客 6万+

对已经存在的TCP系统进行登录验证

要求:使用Media Service作为VOD server,点播流程: WMP - > WMS由于登录帐号保存在数据库,要实现自己的验证机制,需要在WMS前面加上Socket代理,检查URL中包含的SessionKey,验证流程:WMP -> Proxy -> WMS主要是实现一个代理,利用Delphi本身带的控件IdMappedPortTCP很容易就实现了。unit frm

Johnson的专栏 1873
上一篇: OOP在三层系统中的应用
下一篇: 数据集处理成可视树,数据网格自动适应宽度
MAX-长老
博客等级 码龄23年 77粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值