Presentation is loading. Please wait.

Presentation is loading. Please wait.

第二十四章 使用Indy元件設計網路程式 在上一章我們提到了如何在BCB中開發一些基本的網路程式,在這一章我們要介紹的也是網路程式,不過在這邊我們是使用Indy相關的VCL元件來開發網路程式。在BCB中,Indy所提供的功能比FastNet提供的功能還要強大還要好用。

Similar presentations


Presentation on theme: "第二十四章 使用Indy元件設計網路程式 在上一章我們提到了如何在BCB中開發一些基本的網路程式,在這一章我們要介紹的也是網路程式,不過在這邊我們是使用Indy相關的VCL元件來開發網路程式。在BCB中,Indy所提供的功能比FastNet提供的功能還要強大還要好用。"— Presentation transcript:

1 第二十四章 使用Indy元件設計網路程式 在上一章我們提到了如何在BCB中開發一些基本的網路程式,在這一章我們要介紹的也是網路程式,不過在這邊我們是使用Indy相關的VCL元件來開發網路程式。在BCB中,Indy所提供的功能比FastNet提供的功能還要強大還要好用。

2 大綱 24-1. 什麼是Indy 24-2. Indy元件有哪些 24-3. HTTP抓網頁程式 24-4. 使用Indy開發的小程式
本章習題

3 24-1. 什麼是Indy 在BCB6還未上市之前,就有很多人認為BCB所提供的FastNet的VCL元件功能不夠強大,所提供的功能也不夠完整,還好那時候在網路上有些免費的VCL元件可以讓大家下載使用,在那個時候,Indy就是最常被使用的一套Free的VCL元件。 Indy提供了很多與網路相關的元件,也提供了一堆編碼解碼的元件,對一般的使用者來說,已經非常的足夠。

4 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的網站上看看:

5 24-2. Indy元件有哪些 Indy元件在BCB中共分成三個頁次來放置。
Indy Clients、Indy Servers以及Indy Misc這三個分類。 有關Indy的詳細說明可以參考Help的內容!

6 24-3. HTTP抓網頁程式 這一小節我們將要實作一個HTTP抓網頁的軟體,類似的範例我們在介紹FastNet那邊就已經提過了,可是在這邊我們將利用Indy所提供的『TIdHTTP』來完成這個範例。

7 24-3. HTTP抓網頁程式 範例24-1:HTTP抓網頁程式的實作範例 範例說明
這個範例將和範例23-3幾乎一樣,主要是因為筆者想要呈現使用FastNet以及Indy的差別在那邊。所以在這個範例中,我們也是利用和範例23-3一樣的視窗外觀,一樣的操作方式來實作,唯一的不同就是我們不是使用TNMHTTP這個VCL元件來開發。

8 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)); }

9 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);

10 24-3. HTTP抓網頁程式 範例24-1:HTTP抓網頁程式的實作範例 執行結果

11 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還要來的強大的原因。

12 24-4. 使用Indy開發的小程式 這一小節我們主要是採用多個範例來帶領各位進入Indy程式設計的殿堂,雖然這些範例都很簡單,有些甚至只需要短短的兩三行程式,但希望可以藉著簡單的程式碼,慢慢的學到基本功夫,接下來的真功夫就靠自己去學習了!

13 24-4. 使用Indy開發的小程式 範例24-2:DayTime Client 範例說明
在範例24-2中,我們實作一個DayTime Client,讓這個Application可以去跟遠端的DayTime Server連線,並且抓取DayTime Server上的日期時間。在Client端會將抓到的日期時間顯示出來。在這個範例中,我們主要是利用TIdDayTime這個Indy元件來完成的。

14 24-4. 使用Indy開發的小程式 範例24-2:主要程式碼(main.cpp)
void __fastcall TForm1::Button1Click(TObject *Sender) { if (LabeledEdit1->Text != "") IdDayTime1->Host = LabeledEdit1->Text; LabeledEdit2->Text = IdDayTime1->DayTimeStr; }

15 24-4. 使用Indy開發的小程式 範例24-2:DayTime Client 執行結果

16 24-4. 使用Indy開發的小程式 範例24-3:Echo Client實作 範例說明
在範例24-3,我們主要是利用TIdEcho這個元件來撰寫Echo Client的程式碼,程式的內容也跟上個範例一樣,都非常的簡單!

17 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(); }

18 24-4. 使用Indy開發的小程式 範例24-3:Echo Client實作 執行結果

19 24-4. 使用Indy開發的小程式 範例24-4:ICMP Client實作 範例說明
我們利用TIdIcmpClient這個元件來實作ICMP Client的程式。 在這個程式中,我們可以透過TIdIcmpClient所提供的元件,知道相當多的訊息,例如『Remote IP』、『Round Trip Time』、以及『TTL』等各式各樣的值,相關的回傳資料可以從ReplyStatus這個屬性找到。

20 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; }

21 24-4. 使用Indy開發的小程式 範例24-4:ICMP Client實作 執行結果

22 24-4. 使用Indy開發的小程式 範例24-5:查詢Whois Database的Client程式 範例說明
在範例24-5中,我們將實作一個會跟whois server查詢IP/Domain註冊資料的應用程式。 該程式並不是利用Indy裡面提供的Whois元件,而是直接使用Indy的TIdTCPClient這個元件直接開發,所以在設計上稍微比前面兩三個小程式難一點點點,不過也不是多難的程式,主要的程式碼還是在五行內全部搞定! 在這個範例的程式中有比較特別的就是,我們並沒有直接將所有抓到的資料全部都Print出來,因為那會造成一些排版上的問題,所以我們就利用一段小小的程式碼將我們抓到的資料稍微處理一下,讓這些資料在輸出的時候比較好看。

23 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();

24 24-4. 使用Indy開發的小程式 範例24-5:查詢Whois Database的Client程式 執行結果

25 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處理。

26 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) { IdBase64Decoder1->CodeString(Memo2->Text); Result = IdBase64Decoder1->CompletedInput(); Memo3->Text = Result.SubString(Pos + 1, Result.Length() - Pos);

27 24-4. 使用Indy開發的小程式 範例24-6:Base64 Encode / Decode 執行結果

28 24-4. 使用Indy開發的小程式 範例24-7:UU Encode 範例說明
在這個範例中,我們說明了該如何使用Indy所提供的UUEncode來讓我們輸入的檔案或是數字或是一般文字都變成UUEncode後的結果。從UUEncode的實作面來看,這個範例跟24-6的程式碼相當的接近,可以互相參考比較!

29 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); }

30 24-4. 使用Indy開發的小程式 範例24-7:UU Encode 執行結果

31 24-4. 使用Indy開發的小程式 我們只利用六個小程式來讓各位讀者更悉Indy元件的使用,所以無法將Indy的主要開發精神以及主要的設計概念發揮出來。 如TIdAntiFreeze這個元件,在Indy的整體開發上有很重要的地位。 這章只是學習使用Indy元件的起點,所以後續還有很多Indy元件的應用以及使用,都有待使用者自行發展。

32 本章習題 請利用Indy提供的Client以及Server元件改寫聊天室的程式。 利用Indy元件實作DayTime Server。
利用Indy完成UUDecode以及MD2、MD4、MD5三種不同的Hash function。


Download ppt "第二十四章 使用Indy元件設計網路程式 在上一章我們提到了如何在BCB中開發一些基本的網路程式,在這一章我們要介紹的也是網路程式,不過在這邊我們是使用Indy相關的VCL元件來開發網路程式。在BCB中,Indy所提供的功能比FastNet提供的功能還要強大還要好用。"

Similar presentations


Ads by Google