收藏 分销(赏)

第二十四章 C++ Builder 使用Indy元件设计网路程式.ppt

上传人:xrp****65 文档编号:13371237 上传时间:2026-03-09 格式:PPT 页数:32 大小:164.50KB 下载积分:10 金币
下载 相关 举报
第二十四章 C++ Builder 使用Indy元件设计网路程式.ppt_第1页
第1页 / 共32页
第二十四章 C++ Builder 使用Indy元件设计网路程式.ppt_第2页
第2页 / 共32页


点击查看更多>>
资源描述
按一下以編輯母片標題樣式,按一下以編輯母片文字樣式,第二層,第三層,第四層,第五層,*,*,*,第二十四章 使用,Indy,元件設計網路程式,在上一章我們提到了如何在,BCB,中開發一些基本的網路程式,在這一章我們要介紹的也是網路程式,不過在這邊我們是使用,Indy,相關的,VCL,元件來開發網路程式。在,BCB,中,,Indy,所提供的功能比,FastNet,提供的功能還要強大還要好用。,1,大綱,24-,1.,什麼是,Indy,24-2.Indy,元件有哪些,24-3.HTTP,抓網頁程式,24-4.,使用,Indy,開發的小程式,本章習題,2,24-,1.,什麼是,Indy,在,BCB6,還未上市之前,就有很多人認為,BCB,所提供的,FastNet,的,VCL,元件功能不夠強大,所提供的功能也不夠完整,還好那時候在網路上有些免費的,VCL,元件可以讓大家下載使用,在那個時候,,Indy,就是最常被使用的一套,Free,的,VCL,元件。,Indy,提供了很多與網路相關的元件,也提供了一堆編碼解碼的元件,對一般的使用者來說,已經非常的足夠。,3,24-,1.,什麼是,Indy,Indy,Internet Direct,Indy,是一套完整的網路元件,他不只是免費的,還有,OpenSource,。,Indy,他是利用,Delphi,開發的,使用,blocking socket,來當作底層的,socket,元件,也因為,Indy,是利用,Delphi,開發,所以現在不管是在,Delphi 6,、,Kylix,1,、以及,C+Builder 6,以上的版本(包括)都可以看到,Indy,的身影。想對,Indy,有更深入的了解可以到,Indy,的網站上看看:,,/Indy/,。,4,24-2.Indy,元件有哪些,Indy,元件在,BCB,中共分成三個頁次來放置。,Indy Clients,、,Indy Servers,以及,Indy,Misc,這三個分類。,有關,Indy,的詳細說明可以參考,Help,的內容!,5,24-3.HTTP,抓網頁程式,這一小節我們將要實作一個,HTTP,抓網頁的軟體,類似的範例我們在介紹,FastNet,那邊就已經提過了,可是在這邊我們將利用,Indy,所提供的,TIdHTTP,來完成這個範例。,6,24-3.HTTP,抓網頁程式,範例,24-1,:,HTTP,抓網頁程式的實作範例,範例說明,這個範例將和範例,23-3,幾乎一樣,主要是因為筆者想要呈現使用,FastNet,以及,Indy,的差別在那邊。所以在這個範例中,我們也是利用和範例,23-3,一樣的視窗外觀,一樣的操作方式來實作,唯一的不同就是我們不是使用,TNMHTTP,這個,VCL,元件來開發。,7,24-3.HTTP,抓網頁程式,範例,24-1,:主要程式碼(,main.cpp,),void _,fastcall,TForm1:BitBtn1Click(TObject*Sender),if(LabeledEdit1-Text!=),Memo1-Clear();,Memo2-Clear();,/Get Header Information,IdHTTP1-Head(LabeledEdit1-Text);,Memo1-Lines-,Add(Content,-Type:+IdHTTP1-Response-,ContentType,);,Memo1-Lines-,Add(Content,-Length:+,String(IdHTTP1-Response-,ContentLength,);,Memo1-Lines-Add();,Memo1-Lines-Add(=);,Memo1-Lines-,Add(Get,header information from IdHTTP1-,Reaponse,-*);,/Get Body Data,Memo2-Lines-Add(IdHTTP1-Get(LabeledEdit1-Text);,8,24-3.HTTP,抓網頁程式,範例,24-1,:主要程式碼(,main.cpp,),void _,fastcall,TForm1:BitBtn2Click(TObject*Sender),if(SaveDialog1-Execute(),if(!FileExists(SaveDialog1-,FileName,),Memo1-Lines-SaveToFile(SaveDialog1-,FileName,);,else,ShowMessage,(,檔案已存在,!n);,/-,void _,fastcall,TForm1:BitBtn3Click(TObject*Sender),if(SaveDialog2-Execute(),if(!FileExists(SaveDialog2-,FileName,),Memo2-Lines-SaveToFile(SaveDialog2-,FileName,);,else,ShowMessage,(,檔案已存在,!n);,9,24-3.HTTP,抓網頁程式,範例,24-1,:,HTTP,抓網頁程式的實作範例,執行結果,10,24-3.HTTP,抓網頁程式,範例,24-1,:,HTTP,抓網頁程式的實作範例,抓取網頁資料時,使用,Get,這個,Method,會傳回網頁的資料,若是要抓取網頁的,Header,,則必須要執行,Head,這個,Method,後,再利用,TIdHTTP,的,Response,這個屬性下的一些屬性去抓取所需要的,Header,資料,也就是,TIdHTTP,會幫我們將,Header,先,Parse,好讓使用者方便去使用。,還有很多,TIdHTTP,的功能我們還沒有提到,例如,SSL,的功能以及,Request,屬性內的設定,都是,TIdHTTP,所可以提供的功能。,如果我們將,SSL,的功能啟動的話(將,Intercept,的值改成,SSL,),我們將可以使用,https,的連線方式與遠端溝通,在,Request,的屬性內,有,Accept,、,AcceptCharSet,、,AcceptEncoding,、,AcceptLanguage,、,Content-type,、,ContentVersion,、,ProxyAuthenticate,、,ProxyPassword,、,ProxyServer,、,UserAgent,、,WWWAuthenticate,等約,29,項不同的屬性值可以設定。,在一般,HTTP Client,的設定上,,TIdHTTP,也可以設定,ASCII,的,Filter,、,ProtocolVersion,、,Send,或是,Recive,的,Buffer,大小,甚至可以去設定,Socks,的一些資訊等等,這些都是,TIdHTTP,比,TNMHTTP,還要來的強大的原因。,11,24-4.,使用,Indy,開發的小程式,這一小節我們主要是採用多個範例來帶領各位進入,Indy,程式設計的殿堂,雖然這些範例都很簡單,有些甚至只需要短短的兩三行程式,但希望可以藉著簡單的程式碼,慢慢的學到基本功夫,接下來的真功夫就靠自己去學習了!,12,24-4.,使用,Indy,開發的小程式,範例,24-2,:,DayTime,Client,範例說明,在範例,24-2,中,我們實作一個,DayTime,Client,,讓這個,Application,可以去跟遠端的,DayTime,Server,連線,並且抓取,DayTime,Server,上的日期時間。在,Client,端會將抓到的日期時間顯示出來。在這個範例中,我們主要是利用,TIdDayTime,這個,Indy,元件來完成的。,13,24-4.,使用,Indy,開發的小程式,範例,24-2,:主要程式碼(,main.cpp,),void _,fastcall,TForm1:Button1Click(TObject*Sender),if(LabeledEdit1-Text!=),IdDayTime1-Host=LabeledEdit1-Text;,LabeledEdit2-Text=IdDayTime1-,DayTimeStr,;,14,24-4.,使用,Indy,開發的小程式,範例,24-2,:,DayTime,Client,執行結果,15,24-4.,使用,Indy,開發的小程式,範例,24-3,:,Echo Client,實作,範例說明,在範例,24-3,,我們主要是利用,TIdEcho,這個元件來撰寫,Echo Client,的程式碼,程式的內容也跟上個範例一樣,都非常的簡單!,16,24-4.,使用,Indy,開發的小程式,範例,24-3,:主要程式碼(,main.cpp,),void _,fastcall,TForm1:Button1Click(TObject*Sender),if(LabeledEdit1-Text!=)&,LabeledEdit2-Text!=),IdEcho1-Host=LabeledEdit1-Text;,IdEcho1-Connect();,LabeledEdit3-Text=IdEcho1-Echo(LabeledEdit2-Text);,LabeledEdit4-Text=String(IdEcho1-,EchoTime,)+,millisecond(s,);,IdEcho1-Disconnect();,17,24-4.,使用,Indy,開發的小程式,範例,24-3,:,Echo Client,實作,執行結果,18,24-4.,使用,Indy,開發的小程式,範例,24-4,:,ICMP Client,實作,範例說明,我們利用,TIdIcmpClient,這個元件來實作,ICMP Client,的程式。,在這個程式中,我們可以透過,TIdIcmpClient,所提供的元件,知道相當多的訊息,例如,Remote IP,、,Round Trip Time,、以及,TTL,等各式各樣的值,相關的回傳資料可以從,ReplyStatus,這個屬性找到。,19,24-4.,使用,Indy,開發的小程式,範例,24-4,:主要程式碼(,main.cpp,),void _,fastcall,TForm1:Button1Click(TObject*Sender),IdIcmpClient1-Host=LabeledEdit1-Text;,IdIcmpClient1-Ping();,LabeledEdit2-Text=IdIcmpClient1-,ReplyStatus.FromIpAddress,;,LabeledEdit3-Text=IdIcmpClient1-,ReplyStatus.MsRoundTripTime,;,LabeledEdit4-Text=IdIcmpClient1-,ReplyStatus.TimeToLive,;,20,24-4.,使用,Indy,開發的小程式,範例,24-4,:,ICMP Client,實作,執行結果,21,24-4.,使用,Indy,開發的小程式,範例,24-5,:,查詢Whois,Database的Client,程式,範例說明,在範例,24-5,中,我們將實作一個會跟,whois,server,查詢,IP/Domain,註冊資料的應用程式。,該程式並不是利用,Indy,裡面提供的,Whois,元件,而是直接使用,Indy,的,TIdTCPClient,這個元件直接開發,所以在設計上稍微比前面兩三個小程式難一點點點,不過也不是多難的程式,主要的程式碼還是在五行內全部搞定!,在這個範例的程式中有比較特別的就是,我們並沒有直接將所有抓到的資料全部都,Print,出來,因為那會造成一些排版上的問題,所以我們就利用一段小小的程式碼將我們抓到的資料稍微處理一下,讓這些資料在輸出的時候比較好看。,22,24-4.,使用,Indy,開發的小程式,範例,24-5,:主要程式碼(,main.cpp,),void _,fastcall,TForm1:Button1Click(TObject*Sender),if(ComboBox1-Text!=)&(LabeledEdit1-Text!=),IdTCPClient1-Host=ComboBox1-Text;IdTCPClient1-Connect();,IdTCPClient1-WriteLn(LabeledEdit1-Text);Memo1-Clear();,AnsiString,Result,Line;Result=IdTCPClient1-,AllData,();,while(Result.Length,()0),int,Pos=,Result.Pos(n,);,if(Pos,=1),Result.Delete(1,1);,else,Line=Result.SubString(1,Pos-1);Memo1-Lines-,Add(Line,);Result.Delete(1,Line.Length,();,IdTCPClient1-Disconnect();,23,24-4.,使用,Indy,開發的小程式,範例,24-5,:,查詢Whois,Database的Client,程式,執行結果,24,24-4.,使用,Indy,開發的小程式,範例,24-6,:,Base64 Encode/Decode,範例說明,在範例,24-6,中,我們利用,Indy,Misc,中關於,Base64 Encode/Decode,的元件,實作出這個小應用程式。這個程式主要是將,Input,的資料利用,Base 64 Encode,編碼過後,再將編碼過後的資料解碼,看看前後的資料會不會有誤差!,Base64 Encode/Decode,並不一定只可以使用在一般,String,的,Coding,上,還可以對檔案或是對,Stream,處理。,25,24-4.,使用,Indy,開發的小程式,範例,24-6,:主要程式碼(,main.cpp,),void _,fastcall,TForm1:Button1Click(TObject*Sender),AnsiString,Result;,IdBase64Encoder1-CodeString(Memo1-Text);,Result=IdBase64Encoder1-,CompletedInput,();,int,Pos=,Result.Pos,(;);,Memo2-Text=,Result.SubString(Pos,+1,Result.Length,()-Pos);,/-,void _,fastcall,TForm1:Button2Click(TObject*Sender),AnsiString,Result;,IdBase64Decoder1-CodeString(Memo2-Text);,Result=IdBase64Decoder1-,CompletedInput,();,int,Pos=,Result.Pos,(;);,Memo3-Text=,Result.SubString(Pos,+1,Result.Length,()-Pos);,26,24-4.,使用,Indy,開發的小程式,範例,24-6,:,Base64 Encode/Decode,執行結果,27,24-4.,使用,Indy,開發的小程式,範例,24-7,:,UU Encode,範例說明,在這個範例中,我們說明了該如何使用,Indy,所提供的,UUEncode,來讓我們輸入的檔案或是數字或是一般文字都變成,UUEncode,後的結果。從,UUEncode,的實作面來看,這個範例跟,24-6,的程式碼相當的接近,可以互相參考比較!,28,24-4.,使用,Indy,開發的小程式,範例,24-7,:主要程式碼(,main.cpp,),void _,fastcall,TForm1:Button1Click(TObject*Sender),AnsiString,Result;,IdUUEncoder1-CodeString(Memo1-Text);,Result=IdUUEncoder1-,CompletedInput,();,Memo2-Clear();,int,Pos=,Result.Pos,(;);,Memo2-Text=,Result.SubString(Pos,+1,Result.Length,()-Pos);,29,24-4.,使用,Indy,開發的小程式,範例,24-7,:,UU Encode,執行結果,30,24-4.,使用,Indy,開發的小程式,我們只利用六個小程式來讓各位讀者更悉,Indy,元件的使用,所以無法將,Indy,的主要開發精神以及主要的設計概念發揮出來。,如,TIdAntiFreeze,這個元件,在,Indy,的整體開發上有很重要的地位。,這章只是學習使用,Indy,元件的起點,所以後續還有很多,Indy,元件的應用以及使用,都有待使用者自行發展。,31,本章習題,請利用,Indy,提供的,Client,以及,Server,元件改寫聊天室的程式。,利用,Indy,元件實作,DayTime,Server,。,利用,Indy,完成,UUDecode,以及,MD2,、,MD4,、,MD5,三種不同的,Hash function,。,32,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服