谈Delphi编程中Http协议的应用(一)
2006-09-20 22:17
459 查看
作者 : jingtao |
标题 : 谈Delphi编程中Http协议的应用(一) |
关键字: Http协议 |
分类 : 开发技巧 |
密级 : 参赛 |
(评分:★★★ , 回复: 4, 阅读: 2071) 参加工作后写的第一篇东西 谈Delphi编程中Http协议的应用(一) 陈经韬 Http协议是TCP协议中的一种,因为有了它,您现在才可以看到这篇文章:) Http协议的通信遵循一定的约定.例如,请求一个文件的时候先发送Get请求,然后服务器会返回请求的数据.如果需要进行断点传输,那么先发送'HEAD /'请求,其中返回的'Content-Length: '就是文件实际大小.将其和我们本地需要断点下载的文件大小比较,发送GET请求和发送需要下载的文件开始位置'RANGE: bytes='+inttostr(iFilePos)+'-'+#13#10;服务器如果支持断点下载的话就会接着发送余下的数据了.因为这方面的文章比较多,我在这里就不详细讲述了.感兴趣的朋友可以自行查阅相关资料或者RFC文档.我写的"搜霸"就是采用这种方式进行断点下载的. 当然,如果你是个懒人,也可以直接采用Delphi自带的控件.以Delphi6的INDY组件为例.新建一个工程,放上一个TIdHTTP控件,一个TIdAntiFreeze控件,一个TProgressBar用于显示下载进度.最后放上一个Tbutton用于开始执行我们的命令.代码如下: procedure TForm1.Button1Click(Sender: Tobject);//点击按钮的时候开始下载我们的文件 var MyStream:TMemoryStream; begin IdAntiFreeze1.OnlyWhenIdle:=False;//设置使程序有反应. MyStream:=TMemoryStream.Create; try IdHTTP1.Get('http://www.138soft.com/download/Mp3ToExe.zip',MyStream);//下载我站点的一个ZIP文件 except//INDY控件一般要使用这种try..except结构. Showmessage('网络出错!'); MyStream.Free; Exit; end; MyStream.SaveToFile('c:/Mp3ToExe.zip'); MyStream.Free; Showmessage('OK'); end; procedure TForm1.IdHTTP1WorkBegin(Sender: Tobject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);//开始下载前,将ProgressBar1的最大值设置为需要接收的数据大小. Begin ProgressBar1.Max:=AWorkCountMax; ProgressBar1.Min:=0; ProgressBar1.Position:=0; end; procedure TForm1.IdHTTP1Work(Sender: Tobject; AWorkMode: TWorkMode; const AWorkCount: Integer);//接收数据的时候,进度将在ProgressBar1显示出来. Begin ProgressBar1.Position:=ProgressBar1.Position+AWorkCount; end; IdHTTP1的Get还有一种形式就是获取字符串:例如,上面的程序可以改写成: procedure TForm1.Button1Click(Sender: Tobject); var MyStr:String; begin IdAntiFreeze1.OnlyWhenIdle:=False;//设置使程序有反应. Try MyStr:=IdHTTP1.Get('http://www.138soft.com/default.htm'); except Showmessage('网络出错!'); Exit; end; Showmessage(MyStr); end; 应用:现在很多程序都有自动升级功能,实际上就是应用了GET.先在自己站点放一个文本文件注明程序版本号,当检查升级的时候,取文本内容与当前版本号比较,然后决定升级与否. 实际上,GET还可以用在其它方面,前提是与你的网页文件挂钩.例如,你的个人站点放在你的硬盘上面,你在http://my.yeah.net申请了一个免费的域名,你将URL指向你的IP.但是你的IP是动态的,经常会改变,每次改变后需要手工打开http://my.yeah.net站点进行设置是非常麻烦的.这时候,你可以自己动手写一个程序. 首先,我们来写两个函数从返回页面里提取我们需要的信息. Function GetInfoByYearNetHtm1(const str:string):String; { 功能:从Yeah.Net的域名申请和修改返回网页文件中提取需要的信息 参数:Yeah.Net的网页文件内容 输出:实际的信息 作者:陈经韬 日期:2003,2,8 修改:无 } const SubColor='<font color=red>'; SubCenter1='<center>'; SubCenter2='</center>'; var S:String; I,j,k:integer; begin Result:=''; S:=str; j:=0; repeat i:=Pos(SubColor,LowerCase(S)); if i=0 then break; if Length(s)<(i+Length(SubColor)-1) then Break; Delete(S,1,i+Length(SubColor)-1); i:=Pos(SubCenter1,LowerCase(S)); if i=0 then break else if i<=10 then j:=-1; until j=-1; k:=Pos(SubCenter2,LowerCase(S)); S:=Copy(S,i+Length(SubCenter1),k-i-Length(SubCenter1)); k:=0; repeat i:=pos('<',s); j:=pos('>',s); if (i=0) or (j=0) then Break; Delete(s,I,j-i+1); Insert(' ', S, i); until k=-1; s:=s+'.'; Result:=s; end; function GetInfoByYearNetHtm2(const Str:String):String; { 功能:从Yeah.Net的域名转向返回网页文件中提取需要的信息 参数:Yeah.Net的网页文件内容 输出:实际的信息 作者:陈经韬 日期:2003,2,8 修改:无 } var I,j,k:integer; begin Result:=''; i:=Pos('url=',Str); if i=0 then Exit; i:=i+4; j:=Pos('',Str); if i=0 then Exit; j:=j-2; k:=j-I; Result:=copy(Str,I,k); end; 第一步,我们先来实现注册功能.放上五个Edit控件分别代表注册用户名称,密码1,密码2,Email地址和需要指向的URL.然后用GET方式来注册: procedure TForm1.Button1Click(Sender: Tobject); var StrRecive:String; begin Memo1.Lines.Clear; Memo1.Lines.Add('正在申请域名!'); try StrRecive:=IdHTTP1.Get('http://my.yeah.net/cgi-bin/register?username='+Edit1.Text//注册名称 +'&domain=yeah.net' +'&password='+Edit2.Text//密码1 +'&password2='+Edit3.Text//密码2 +'&email='+Edit4.Text//注册人Email地址 +'&url=http://'+Edit4.Text);//该域名指向的URL Memo1.Lines.Add(GetInfoByYearNetHtm1(StrRecive)); except Memo1.Lines.Add('申请域名错误!请检查网络!'); end; end; 第二步,当你需要更新自己的IP地址的时候: procedure TForm1.Button2Click(Sender: Tobject); var StrRecive:String; begin Memo1.Lines.Clear; Memo1.Lines.Add('正在更新域名!'); try StrRecive:=IdHTTP1.Get('http://my.yeah.net/cgi-bin/modify?username='+Edit1.Text//注册名称 +'&domain=yeah.net' +'&password='+Edit2.Text//密码1 +'&url=http://'+Edit4.Text);//该域名指向的URL Memo1.Lines.Add(GetInfoByYearNetHtm1(StrRecive)); except Memo1.Lines.Add('更新IP错误!请检查网络!'); end; end; 第三步:当然是你的程序取的真实指向了:) procedure TForm1.Button3Click(Sender: Tobject); begin try Memo1.Lines.Add(GetInfoByYearNetHtm2(IdHTTP1.Get(Edit4.Text)));//eg:http://lovejingtao.yeah.net except Memo1.Lines.Add('更新IP错误!请检查网络!'); end; end; 当然,如果你的程序想写的非常小,那么就要动用API了.大概过程如下: ……….. ……….. HeadInfo:=''; HeadInfo:=HeadInfo+'GET /'+''+' HTTP/1.1'+#13#10; HeadInfo:=HeadInfo+'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*'+#13#10; HeadInfo:=HeadInfo+'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)'+#13#10; HeadInfo:=HeadInfo+'RANGE: bytes='+inttostr(533263)+'-533263'+#13#10; HeadInfo:=HeadInfo+'Host: '+GetHost(HostName)+#13#10; HeadInfo:=HeadInfo+#13#10; ZeroMemory(@SendStrBuf,SizeOf(SendStrBuf)); for Re:=0 to Length(HeadInfo)-1 do SendStrBuf[Re]:=HeadInfo[Re+1]; Re:=send(MySocket,SendStrBuf,Strlen(SendStrBuf),0); if Re = SOCKET_ERROR then begin CloseSocket(MySocket); WSACleanUP();//Winsocket释构 Exit; end; Re:=recv(MySocket,ReciveStrBuf,SizeOf(ReciveStrBuf),0); if Re = SOCKET_ERROR then begin CloseSocket(MySocket); WSACleanUP();//Winsocket释构 Exit; end; Result:=GetInfoByYearNetHtm2(ReciveStrBuf); ………. ………. 应用:(1)无IP电脑取有IP电脑的地址,就是有IP的电脑把自己的IP更新上去,然后无IP的电脑去取回来连接.两者均是用GET.(2)注册版软件:在网站后台建立一个数据库,软件自动去取ID判断合法与否.现在一般注册软件都采用这种办法. 第一节终于写完了.很久没写技术文档资料,倒是经常写开发文档和公司硬件设备的开发SDK,已经有点生疏了.参加工作后一直都非常忙,今天晚上和小枫去拨火罐,要四小时后才能洗澡,于是坐下来花了半个小时写了这篇东西.希望大家喜欢.实际上,http协议的用途是非常大的.后面的章节讲述的内容可能如下:(1)http隧道的实现:写一个HTTP服务器,实现一些奇特的功能.例如:用IE查看别人的屏幕.遥控别人的电脑等.(2)WEB自动下载程序的三种方法.以及其它一些鲜为人知的应用.什么时候写出来?就要看有没有时间了,更重要的是你们喜欢与否. 2003,9,18凌晨. 作者:陈经韬 主页:http://www.138soft.com 转载请注明出处.谢谢. ©CopyRight 2000-2005 2003-9-28 15:19:00 |
相关文章推荐
- 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结
- HTTP协议理解与应用总结
- HTTP协议演示_基于 HTTP 的 Web Forms 编程1-5
- HTTP协议演示_基于 HTTP 的 Web Forms 编程4-5-HTTP 协议
- [ZT]HTTP协议的C语言编程实现实例
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
- Android网络编程之TCP/IP,HTTP,HTTPS协议了解
- 门面模式的典型应用 Socket 和 Http(post,get)、TCP/IP 协议的关系总结
- Http协议中 常用的参数应用
- 实战 linux蓝牙编程之(八) hci 协议 应用编程实现
- 通过 http 协议上传文件(rfc1867协议概述,jsp 应用举例,客户端发送内容构造)
- C#网络编程——第二篇 HTTP应用编程(上)
- HTTP协议的C语言编程实现实例[摘抄]
- Unity基于HTTP协议的应用
- 通过 http 协议上传文件(rfc1867协议概述,jsp 应用举例,客户端发送内容构造)
- Delphi编程中资源文件的应用
- QT:HTTP协议简单应用
- 应用层HTTP协议详解
- Apache环境下PHP利用HTTP缓存协议原理解析及应用分析