二十三章InterNet網(wǎng)路程式設(shè)計ppt課件_第1頁
二十三章InterNet網(wǎng)路程式設(shè)計ppt課件_第2頁
二十三章InterNet網(wǎng)路程式設(shè)計ppt課件_第3頁
二十三章InterNet網(wǎng)路程式設(shè)計ppt課件_第4頁
二十三章InterNet網(wǎng)路程式設(shè)計ppt課件_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第二十三章 InterNet網(wǎng)路程式設(shè)計有沒有想過本人寫個Service呢?想不想本人也寫一套發(fā)信程式呢?在這一章節(jié)裡,我們將介紹socket的觀念以及BCB在Internet上開發(fā)應用程式的方法。 大綱 23-1. Socket觀念 23-2. 哪些VCL元件可以運用 23-3. 寄信程式 23-4. 抓網(wǎng)頁程式 23-5. 一些Client端的小程式 23-6. 聊天室 23-7. CGI程式設(shè)計 本章習題23-1. Socket觀念 Socket是一種API,他介於網(wǎng)路應用程式跟通訊協(xié)定之間,他就像是普通的程式中提供的函式一樣,只不過Socket是專用於網(wǎng)路程式之中。所以說,Socket

2、也屬於System call,讓運用者可以在程式中直接呼叫,就好似在C/C+語言中他要輸入就需求運用scanf、cin或是輸出時會用到printf、cout等等。 雖然說運用Socket就像運用普通的函式一樣簡單,但是還是必須要具備一些根本的通訊協(xié)定概念,不然什麼時候要呼叫socket、bind等函式就一頭霧水了,只是我們只需求了解,不需求知道怎麼寫出這些API。 23-1. Socket觀念 Socket最早是出現(xiàn)在BSD系列的Unix主機中,所以現(xiàn)在大家在學習Socket的過程中,最常聽到的就是Berkeley Socket。當然現(xiàn)在我們是在Windows上寫Socket的程式,所以我們運

3、用的Socket就被稱做Win Socket。 會叫做Berkeley的緣由是BSD中的B就是Berkeley。 Win Socket跟Berkeley Socket有什麼不同? 除了作業(yè)系統(tǒng)開發(fā)環(huán)境的不同外,其餘皆大同小異,因為大家通常都會遵照著Berkeley Socket的標準來開發(fā)整個Socket的API。 23-1. Socket觀念 Socket的定義 網(wǎng)路連線的兩端之間,為了要相互聯(lián)繫以及溝通所用的介面就稱做Socket。這兩端無論是不是在LAN內(nèi)都可以。 在Unix下要寫網(wǎng)路程式真的需求對整個Socket以及通訊協(xié)定有一定的熟習度,但是現(xiàn)在BCB突破了如此的迷失。BCB內(nèi)部提供

4、了Server/Client Socket供Server端以及Client端運用,我們不需求本人漸漸寫程式碼來建立連線,他只需設(shè)定好Server/Client Socket的一些屬性,BCB就會幫他完成一堆瑣碎的事情。 我們所要考慮的只剩下該如何設(shè)計整個網(wǎng)路程式的主體。23-2. 哪些VCL元件可以運用 在BCB6中撰寫有關(guān)網(wǎng)路的程式,會有許多的VCL元件可供我們運用。 例如Webservices、InternetExpress、Internet、WebSnap、FastNet、Indy Clients、以及Indy Servers等等,都是發(fā)展網(wǎng)路相關(guān)程式的元件。 在這一章裡,我們主要要介紹

5、的元件都分布在Internet和FastNet這兩個Page中,包括Client/Server Socket或是其他已經(jīng)包裝好的VCL元件都可以找的到。 23-2. 哪些VCL元件可以運用 InterNet中比較常用到的元件 ClientSocket Client端的TCP Socket API??梢岳眠@個元件讓我們運用TCP通訊協(xié)定開發(fā)Client端的網(wǎng)路應用程式 ServerSocket Server端的TCP Socket API??梢岳眠@個元件讓我們運用TCP通訊協(xié)定開發(fā)Server端的網(wǎng)路應用程式 FastNet中比較常用到的元件 NMDayTime 可以傳回Server端的日期

6、以及時間 NMMsg 傳送普通的文字訊息 23-2. 哪些VCL元件可以運用 FastNet中比較常用到的元件 NMMSGServ 接納普通的文字訊息 NMEcho 傳送或是接納訊息,和NMMsg以及NMMSGServ有部分類似 NMFTP 設(shè)計FTP Client端的VCL元件,主要用來檔案傳輸 NM 利用 通訊協(xié)定獲得HTML的文件 NMNNTP 從新聞伺服器接納文章,或是傳送文章到新聞伺服器 23-2. 哪些VCL元件可以運用 FastNet中比較常用到的元件 NMStrm 傳送資料流 NMStrmServ 接納NMStrm送過來的資料流 NMPOP3 運用POP3通訊協(xié)定來接納或是傳送

7、信件 NMSMTP 運用SMTP通訊協(xié)定來傳送郵件 NMTime 可以傳回Server端的時間 23-2. 哪些VCL元件可以運用 FastNet中比較常用到的元件 NMUDP 傳輸?shù)耐ㄓ崊f(xié)定改用UDP Protocol NMURL 將URL編碼/解碼成普通的文字字串 NMUUProcess 運用MIME或是UU En/Decode來編碼/解碼 NMFinger 獲得Server端運用者的訊息 23-3. 寄信程式 在這一小節(jié)我們將寫一個小小的寄信程式,讓運用者可以直接在電腦上寄出信件。 這個程式可以說是相當?shù)暮唵?,看起來似乎不太像是網(wǎng)路程式,其實最主要是因為這些底層的程式碼BCB都幫我們包裝

8、好了,所以才不需求寫太多程式碼。這個程式我們將會放在範例23-1中。 23-3. 寄信程式 範例23-1:寄信程式的開發(fā) 範例說明 範例23-1主要是希望可以利用BCB強大又好用的VCL元件快速的開發(fā)出一個寄信程式出來,在這個範例中,我們主要運用了FastNet中的NMSMTP這個VCL元件來寄信。整個開發(fā)過程我們完全不需求知道任何跟網(wǎng)路相關(guān)的知識,我們只需求知道NMSMTP中的各個屬性該填入什麼樣的值即可! 範例23-1的設(shè)計畫面 用到LabeledEdit、Memo、ListBox、BitBtn、StatusBar、NMSMTP、以及OpenDialog這七種VCL元件23-3. 寄信程式

9、 範例23-1:寄信程式的開發(fā) 設(shè)定OpenDialog 將OpenDialog中的ofAllowMultiSelect這個屬性的值改成true,讓運用者在選擇附加檔案的時候可以多重選擇。 也將Filter的值設(shè)定成All File|*,也就是預設(shè)讀取一切的檔案。 23-3. 寄信程式 範例23-1:寄信程式的開發(fā) 功能的需求 選擇附加檔案預計要做到選了幾個檔案就必須要全部填入ListBox中,假設(shè)是要取消則是選取ListBox的內(nèi)容後按下Delete按鈕,這樣子可以方便運用這套Mail Sender來寄送附帶檔案。 有關(guān)寄送信件的這段程式碼中,會先判斷是不是有些必要的值沒有被輸入,假設(shè)有短少

10、某些值,程式會自動判斷出短少哪些值,並要求重新輸入假設(shè)輸入的值都沒有短少,就會馬上進入寄信的程式。在寄信的一開始我們要先Connect上Mail Server,連上了之後,我們才繼續(xù)將一些資訊寫入NMSMTP中,等這些事情都做完了,我們就可以執(zhí)行Send這個函式將這封Mail利用所指定的Server寄出。 23-3. 寄信程式 範例23-1:主要程式碼main.cpp 傳送郵件部分程式碼/-/ 傳送郵件/-void _fastcall TForm1:BitBtn1ClickTObject *Sender /宣告一個AnsiString用來放置要給使用者看的錯誤訊息 AnsiString msg

11、; /判斷是不是有必要的欄位沒有填寫 if LabeledEdit1-Text != “ & LabeledEdit2-Text != & LabeledEdit3-Text != & LabeledEdit4-Text != & LabeledEdit5-Text != /將各個欄位的資料全部寫入變數(shù)中,這樣比較方便在程式中使用 AnsiString Server = LabeledEdit1-Text; int Port = LabeledEdit2-Text.ToInt; AnsiString User = LabeledEdit3-Text; AnsiS

12、tring Subject = LabeledEdit4-Text; AnsiString To = LabeledEdit5-Text; 23-3. 寄信程式 範例23-1:主要程式碼main.cpp 傳送郵件部分程式碼 /將Server Side相關(guān)屬性設(shè)定好 NMSMTP1-Host = Server; /填入 E-mail Server 的位址 NMSMTP1-Port = Port; /填入E-mail Server 的 Port, 一般都是使用25 NMSMTP1-UserID = User; /填入User Name NMSMTP1-Connect; /與Server連線 /將各

13、個資料填入NMSMTP的PostMessage中 NMSMTP1-PostMessage-FromAddress = User + + Server; /填入寄信者的e-mail address NMSMTP1-PostMessage-FromName = User; /填入寄件者的姓名 NMSMTP1-PostMessage-Subject = Subject; /填入信件標題 NMSMTP1-PostMessage-ToAddress-AddTo; /填入收信人的E-mail Address /填入副本收件者的E-mail Address NMSMTP1-PostMessage-ToCar

14、bonCopy-AddLabeledEdit6-Text; /填入密件副本收件者的E-mail Address NMSMTP1-PostMessage-ToBlindCarbonCopy-AddLabeledEdit7-Text; NMSMTP1-PostMessage-Body-AssignMemo1-Lines; /填入信件內(nèi)容 NMSMTP1-SendMail; /將信送出23-3. 寄信程式 範例23-1:主要程式碼main.cpp 傳送郵件部分程式碼 /將信送出後.把輸入框內(nèi)的資料清空 LabeledEdit1-Text = ; LabeledEdit2-Text = 25; Lab

15、eledEdit3-Text = ; LabeledEdit4-Text = ; LabeledEdit5-Text = ; LabeledEdit6-Text = ; LabeledEdit7-Text = ; ListBox1-Clear; Memo1-Clear; else /假如在檢查的時後發(fā)現(xiàn)有重要的資訊沒有填寫,就會依照沒有填寫的項目一一警告使用者要填入 /在這邊會警告的是第一個沒填入的,並不是只要沒填就出現(xiàn)警告 /假如要做到只要填寫錯誤就出現(xiàn)錯誤訊息,只要把所有的else if拿掉改用if即可 if LabeledEdit1-Text = msg = Please inpit t

16、he server host!n; MessageBoxGetActiveWindow, msg.c_str, NULL, MB_OK|MB_ICONERROR; LabeledEdit1-SetFocus; else if LabeledEdit2-Text = msg = Please inpit the server port!n; MessageBoxGetActiveWindow, msg.c_str, NULL, MB_OK|MB_ICONERROR; LabeledEdit2-SetFocus; 23-3. 寄信程式 範例23-1:主要程式碼main.cpp 傳送郵件部分程式碼

17、else if LabeledEdit3-Text = msg = Please input the user id!n; MessageBoxGetActiveWindow, msg.c_str, NULL, MB_OK|MB_ICONERROR; LabeledEdit3-SetFocus; else if LabeledEdit4-Text = msg = Please input the mail subject!n; MessageBoxGetActiveWindow, msg.c_str, NULL, MB_OK|MB_ICONERROR; LabeledEdit4-SetFocu

18、s; else if LabeledEdit5-Text = msg = Please input the mail receiver!n; MessageBoxGetActiveWindow, msg.c_str, NULL, MB_OK|MB_ICONERROR; LabeledEdit5-SetFocus; 23-3. 寄信程式 範例23-1:主要程式碼main.cpp 新增郵件附件檔部分程式碼/-/ 新增郵件附件檔/-void _fastcall TForm1:BitBtn2ClickTObject *Sender if OpenDialog1-Execute /將我們選取的郵件附件檔

19、的完好檔名加到PostMessage中 NMSMTP1-PostMessage-Attachments-AddStringsOpenDialog1-Files; /將我們選取的檔案的檔名加到List中 for int i = 0 ; i Files-Count ; i+ ListBox1-Items-AddExtractFileNameOpenDialog1-Files-Stringsi; 23-3. 寄信程式 範例23-1:主要程式碼main.cpp 刪除郵件附件檔部分程式碼/-/刪除郵件附件檔/-void _fastcall TForm1:BitBtn3ClickTObject *Send

20、er if ListBox1-SelectedListBox1-ItemIndex /將選取的郵件附件檔移除 /在這邊除了要從PostMessage中移除外.也要從ListBox中移除 /移除在這邊都是使用Index的方式. /因為我們在新增附件檔的時候.都是採用append的方式 /所以不論是在PostMessage或是在ListBox中的Index都是一樣的 /並不會有順序亂掉的問題.所以才可以使用這樣的code. /假如要將程式寫的嚴謹一點.參與check file name的判斷即可 NMSMTP1-PostMessage-Attachments-DeleteListBox1-Item

21、Index; ListBox1-Items-DeleteListBox1-ItemIndex; 23-3. 寄信程式 範例23-1:執(zhí)行結(jié)果一個簡單的寄信程式就經(jīng)完成了,簡單吧!不過,不知道大家有沒有發(fā)現(xiàn)一些事情?假設(shè)Server忽然連不上去怎麼辦?假設(shè)Server主機的位址被亂填怎麼辦?假設(shè)附加檔名不存在怎麼辦?假設(shè)。有著太多不確定的問題在這個程式中了,那我們該如何解決呢?我們將在範例23-2中告訴各位這些不確定性的問題該如何解決。範例23-2主要是由範例23-1改過來的,根據(jù)範例23-1中的一些小缺點作一些改進。 23-3. 寄信程式 範例23-2:寄信程式加強版的開發(fā) 範例說明 範例23

22、-2主要是修正了範例23-1的一些缺點,包括了連線上的問題,附帶檔的問題,以及一些我們必須要本人handle的問題我們都在範例23-2中一併解決。 在這個範例中最大的差別就是在多了Connect和Disconnect這兩個按鈕。為什麼要多這兩個呢?最主要是因為假設(shè)他還沒有確定可以跟Server連結(jié)上就將mail送進來,這時就會發(fā)生例外事件,假設(shè)我們在還沒Connect之前不讓運用者可以按下Send鈕就可以保證不會發(fā)生Connect Fail的例外事件發(fā)生。 23-3. 寄信程式 範例23-2:主要程式碼main.cpp 可以用來檢查輸入資料的方法很多,包括用例外事件的寫法或是利用一堆If來做判

23、斷都可以,在這個範例中,我們運用最根本的If來檢查資料的正確性。 在這個範例中除了用If來判斷資料的正確性外,我們還運用了BCB所提供的一些函式來判斷連線的狀況。 在這份投影片中,我們只列出運用BCB函式來判斷連線的程式碼。想要了解範例完好的程式碼,請參考書上的程式碼。23-3. 寄信程式 範例23-2:主要程式碼main.cpp 與Server連線部分程式碼/-/ 與Server連線/-void _fastcall TForm1:BitBtn4ClickTObject *Sender /宣告一個AnsiString用來放置要給使用者看的錯誤訊息 AnsiString msg; /判斷是不是有

24、必要的欄位沒有填寫 if LabeledEdit1-Text != & LabeledEdit2-Text != & LabeledEdit3-Text != /將各個欄位的資料全部寫入變數(shù)中,這樣比較方便在程式中使用 AnsiString Server = LabeledEdit1-Text; int Port = LabeledEdit2-Text.ToInt; AnsiString User = LabeledEdit3-Text; /將Server Side相關(guān)屬性設(shè)定好 NMSMTP1-Host = Server; /填入 E-mail Server 的位址 NMSM

25、TP1-Port = Port; /填入E-mail Server 的 Port, 一般都是使用25 NMSMTP1-UserID = User; /填入User Name23-3. 寄信程式 範例23-2:主要程式碼main.cpp 與Server連線部分程式碼 /一切設(shè)定都確認有輸入之後.改變以下這些屬性 BitBtn1-Enabled = true; BitBtn2-Enabled = true; BitBtn3-Enabled = true; BitBtn4-Enabled = false; BitBtn5-Enabled = true; LabeledEdit1-ReadOnly =

26、 true; LabeledEdit2-ReadOnly = true; LabeledEdit3-ReadOnly = true; /與Server連線 NMSMTP1-Connect; else /假如在檢查的時後發(fā)現(xiàn)有重要的資訊沒有填寫,就會依照沒有填寫的項目一一警告使用者要填入 /在這邊會警告的是第一個沒填入的並不是只要沒填就出現(xiàn)警告 /假如要做到只要填寫錯誤就出現(xiàn)錯誤訊息,只要把所有的else if拿掉改用if即可 if LabeledEdit1-Text = msg = Please inpit the server host!n; MessageBoxGetActiveWindo

27、w, msg.c_str, NULL, MB_OK|MB_ICONERROR; LabeledEdit1-SetFocus; 23-3. 寄信程式 範例23-2:主要程式碼main.cpp 與Server連線部分程式碼 else if LabeledEdit2-Text = msg = Please inpit the server port!n; MessageBoxGetActiveWindow, msg.c_str, NULL, MB_OK|MB_ICONERROR; LabeledEdit2-SetFocus; else if LabeledEdit3-Text = msg = Ple

28、ase input the user id!n; MessageBoxGetActiveWindow, msg.c_str, NULL, MB_OK|MB_ICONERROR; LabeledEdit3-SetFocus; 23-3. 寄信程式 範例23-2:主要程式碼main.cpp 與Server斷線部分程式碼/-/ 與Server斷線/-void _fastcall TForm1:BitBtn5ClickTObject *Sender NMSMTP1-Disconnect; /斷線之後將所有的屬性恢復預設(shè)值,將該清乾淨的輸入框清乾淨 LabeledEdit1-Text = ; Label

29、edEdit2-Text = 25; LabeledEdit3-Text = ; LabeledEdit4-Text = ; LabeledEdit5-Text = ; LabeledEdit6-Text = ; LabeledEdit7-Text = ; Memo1-Clear; ListBox1-Clear; /將一些改成唯讀的屬性改回來 LabeledEdit1-ReadOnly = false; LabeledEdit2-ReadOnly = false; LabeledEdit3-ReadOnly = false; /重新設(shè)定按鈕的Enable屬性 BitBtn1-Enabled =

30、 false; BitBtn2-Enabled = false; BitBtn3-Enabled = false; BitBtn4-Enabled = true; BitBtn5-Enabled = false;23-3. 寄信程式 範例23-2:主要程式碼main.cpp Connection Failed 時所呼叫的Function /-/ Connection Failed 時所呼叫的Function/-void _fastcall TForm1:NMSMTP1ConnectionFailedTObject *Sender /宣告一個AnsiString用來放置要給使用者看的錯誤訊息 A

31、nsiString msg; /跳出一個訊息告訴使用者連線失敗 msg = Connection Failed!n; MessageBoxGetActiveWindow, msg.c_str, NULL, MB_OK|MB_ICONERROR; /連線錯誤之後將所有的屬性恢復預設(shè)值,將該清乾淨的輸入框清乾淨 LabeledEdit1-Text = ; LabeledEdit2-Text = 25; LabeledEdit3-Text = ; LabeledEdit4-Text = ; LabeledEdit5-Text = “; LabeledEdit6-Text = ; LabeledEdi

32、t7-Text = ; Memo1-Clear; ListBox1-Clear; /將一些改成唯讀的屬性改回來 LabeledEdit1-ReadOnly = false; LabeledEdit2-ReadOnly = false; LabeledEdit3-ReadOnly = false; /重新設(shè)定按鈕的Enable屬性 BitBtn1-Enabled = false; BitBtn2-Enabled = false; BitBtn3-Enabled = false; BitBtn4-Enabled = true; BitBtn5-Enabled = false;23-3. 寄信程式

33、範例23-2:寄信程式加強版的開發(fā) 執(zhí)行結(jié)果23-3. 寄信程式 假設(shè)各位有發(fā)現(xiàn)的話,在範例23-2應該會看到多了NMSMTP1ConnectionFailed這個函式,這個就是當ConnectionFailed的時候會觸發(fā)的事件程序 在NMSMTP中有關(guān)各種Failed所引發(fā)的事件還有 OnAttatchmentNotFound、OnAuthenticationFailed、OnConnectionFailed、OnFailure、OnHeaderIncomplete、OnInvalidHost、OnRecipienNotFound等事件 這些事件的用法跟OnConnectionFailed

34、的用法都差不多,大家可以嘗試著運用看看,一套完善的發(fā)信軟體必須要能handle住上面所列的那些Exception才不至於一天到晚出問題,也希望讀者可以透過範例29-2繼續(xù)完成還沒Implement的這些Failed相關(guān)的Event,讓這個寄信程式可以更完美。 23-4. 抓網(wǎng)頁程式 上一節(jié)我們舉了Mail Client當作一個範例,這邊我們再舉一個利用 Protocol來抓取網(wǎng)頁資料的小程式。這個程式我們將放在範例23-3中。 這個程式最主要是抓取我們所指定的網(wǎng)頁的資料,傳回值為這個網(wǎng)頁的Header以及Body。 這個程式設(shè)計上相當?shù)暮唵?,只用了一個NM 以及兩個SaveDialog為隱藏的

35、VCL元件,其餘的就是PageControl、Panel、Edit、Memo、以及BitBtn等根本的元件。 23-4. 抓網(wǎng)頁程式 範例23-3:網(wǎng)頁抓取範例 範例說明 在該範例中,我們將利用NM 這個元件抓取網(wǎng)路上任何一個網(wǎng)頁的Header以及Body這兩個重要資料。底下我們將一步一步告訴讀者我們該如何完成這個範例。 Step 1: 開新專案,並且將該運用到的VCL元件放到Form上面 Step 2: 設(shè)定相關(guān)屬性 SaveDialog NM Step 3: 程式碼的撰寫 23-4. 抓網(wǎng)頁程式 範例23-3:主要程式碼main.cppvoid _fastcall TForm1:BitBt

36、n1ClickTObject *Sender if LabeledEdit1-Text != NM 1-GetLabeledEdit1-Text; Memo1-Lines-AddNM 1-Header; Memo2-Lines-AddNM 1-Body; /-void _fastcall TForm1:BitBtn2ClickTObject *Sender if SaveDialog1-Execute if !FileExistsSaveDialog1-FileName Memo1-Lines-SaveToFileSaveDialog1-FileName; else ShowMessage檔案

37、已存在!n; /-void _fastcall TForm1:BitBtn3ClickTObject *Sender if SaveDialog2-Execute if !FileExistsSaveDialog2-FileName Memo2-Lines-SaveToFileSaveDialog2-FileName; else ShowMessage檔案已存在!n; 23-4. 抓網(wǎng)頁程式 範例23-3:網(wǎng)頁抓取範例 執(zhí)行結(jié)果23-5. 一些Client端的小程式 在這一小節(jié)我們將寫一些簡單的Client/Server程式,全部是利用FastNet內(nèi)的元件所完成的。 DateTime、Tim

38、e、Message、Echo、NNTP、Stream、POP3、URL、MIME、UUDecode、Finger等?,F(xiàn)在我們就利用範例23-4、23-5、23-6、23-7、23-8、23-9、23-10、23-11、以及23-12解釋各個元件的運用方法。 23-5. 一些Client端的小程式 範例23-4:DayTime / Time範例 範例說明 DayTime、以及Time這兩種服務主要就是傳回目前Server上的時間以及日期。 我們寫的這個程式就是去Server上要回這些資料並且顯示出來。在這個介面中,我們將DayTime以及Time兩種不同的服務分開寫,這樣可以讓運用者更容易分辨這

39、兩種VCL元件的用法。 23-5. 一些Client端的小程式 範例23-4:主要程式碼main.cppvoid _fastcall TForm1:BitBtn1ClickTObject *Sender /使用NMDayTime抓取Server的Date and Time,假如Server Host和Port皆有輸入才連線去抓取資料 if LabeledEdit1-Text != & LabeledEdit2-Text != /將相關(guān)的值設(shè)定到變數(shù).方便使用 AnsiString Server = LabeledEdit1-Text; int Port = LabeledEdit2-T

40、ext.ToInt; /指定Server Host以及Server Port NMDayTime1-Host = Server; NMDayTime1-Port = Port; /抓取Server端的DateTime LabeledEdit3-Text = NMDayTime1-DayTimeStr; /-void _fastcall TForm1:NMDayTime1ConnectionFailedTObject *Sender /當NMDayTime連線錯誤時發(fā)生的事件 MessageBoxGetActiveWindow, 連線失?。, NULL, MB_OK|MB_ICONERROR;

41、/-void _fastcall TForm1:NMDayTime1InvalidHostbool &Handled /當NMDayTime發(fā)現(xiàn)輸入的Server Host不合法所發(fā)生的事件 MessageBoxGetActiveWindow, 不合法的位址!n, NULL, MB_OK|MB_ICONERROR;23-5. 一些Client端的小程式 範例23-4:主要程式碼main.cppvoid _fastcall TForm1:BitBtn2ClickTObject *Sender /使用NMTime抓取Server的Time,假如Server Host和Port皆有輸入才連線

42、去抓取資料 if LabeledEdit4-Text != & LabeledEdit6-Text != /將相關(guān)的值設(shè)定到變數(shù).方便使用 AnsiString Server = LabeledEdit4-Text; int Port = LabeledEdit6-Text.ToInt; /指定Server Host以及Server Port NMTime1-Host = Server; NMTime1-Port = Port; /抓取Server端的Time LabeledEdit5-Text = NMTime1-TimeStr; /-void _fastcall TForm1:NM

43、Time1ConnectionFailedTObject *Sender /當NMTime連線錯誤時發(fā)生的事件 MessageBoxGetActiveWindow, 連線失?。, NULL, MB_OK|MB_ICONERROR;/-void _fastcall TForm1:NMTime1InvalidHostbool &Handled /當NMTime發(fā)現(xiàn)輸入的Server Host不合法所發(fā)生的事件 MessageBoxGetActiveWindow, 不合法的位址!n, NULL, MB_OK|MB_ICONERROR;23-5. 一些Client端的小程式 範例23-4:D

44、ayTime / Time範例 執(zhí)行結(jié)果23-5. 一些Client端的小程式 範例23-5:Message Server / Client範例 範例說明 Message這部分的程式分成Server端以及Client端,運用6711這個Port來傳輸Message。這個程式最主要的功能就是Server端可以接納來自Client端的資料。 23-5. 一些Client端的小程式 範例23-5:主要程式碼main.cpp Server Side Codevoid _fastcall TForm1:BitBtn1ClickTObject *Sender /去除Message Log Memo1-Cl

45、ear;/-void _fastcall TForm1:NMMSGServ1MSGTComponent *Sender, const AnsiString sFrom, const AnsiString sMsg /將收到的訊息放在msg這個AnsiString中 AnsiString msg = sFrom + = + sMsg; /停頓一些時間.讓程式處理Socket Sleep100; /將收到的Log Append到Memo上 Memo1-Lines-Addmsg;23-5. 一些Client端的小程式 範例23-5:主要程式碼main.cpp Client Side Codevoid

46、 _fastcall TForm1:BitBtn2ClickTObject *Sender /檢查是否三個Edit全部都填入資料了 if LabeledEdit1-Text != & LabeledEdit2-Text != & LabeledEdit3-Text != NMMsg1-Host = LabeledEdit1-Text; /設(shè)定Server Host NMMsg1-FromName = LabeledEdit2-Text; /設(shè)定Senders Name NMMsg1-PostItLabeledEdit3-Text; /將要送出的Message Post進來給Se

47、rver LabeledEdit3-Text = ; /將送出的內(nèi)容從LabeledEdit中去除 /-void _fastcall TForm1:LabeledEdit3KeyPressTObject *Sender, char &Key /功能跟BitBtn2一樣,不過這個事件是用來抓取Enter這個鍵 /假如我們在LabeledEdit中按下Enter,程式就會自動幫我們把訊息送進來 if Key = 13 if LabeledEdit1-Text != & LabeledEdit2-Text != & LabeledEdit3-Text != NMMsg1-Ho

48、st = LabeledEdit1-Text; NMMsg1-FromName = LabeledEdit2-Text; NMMsg1-PostItLabeledEdit3-Text; LabeledEdit3-Text = ; 23-5. 一些Client端的小程式 範例23-5:Message Server / Client範例 執(zhí)行結(jié)果23-5. 一些Client端的小程式 範例23-6:Echo Client範例 範例說明 Echo Server主要的用途就是將Client發(fā)給Server的訊息傳送回來。在這個程式中,我們除了將訊息傳送回來外,我們也參與了時間的計算,看看整個傳送過程中

49、需求多少時間。 23-5. 一些Client端的小程式 範例23-6:主要程式碼main.cppvoid _fastcall TForm1:BitBtn1ClickTObject *Sender /該輸入的資訊都有輸入就與Server建立連線 if LabeledEdit1-Text != & LabeledEdit2-Text != /設(shè)定屬性 NMEcho1-Host = LabeledEdit1-Text; NMEcho1-Port = LabeledEdit2-Text.ToInt; NMEcho1-Connect; /與Server離線 /-void _fastcall TF

50、orm1:BitBtn2ClickTObject *Sender NMEcho1-Disconnect; /與Server切斷連線/-void _fastcall TForm1:BitBtn3ClickTObject *Sender /傳送LabeledEdit3的Text至Echo Server,將Echo送回的字串放到LabeledEdit4的Text中 /並且將整個Echo所花的時間紀錄到LabeledEdit5的Text中 if LabeledEdit3-Text != LabeledEdit4-Text = NMEcho1-EchoLabeledEdit3-Text; Labeled

51、Edit5-Text = FloatToStrNMEcho1-ElapsedTime + milliseconds; 23-5. 一些Client端的小程式 範例23-6:主要程式碼main.cppvoid _fastcall TForm1:LabeledEdit3KeyPressTObject *Sender, char &Key /與BitBtn3功能一樣.只是在這邊不需要按下按鈕 /只要在LabeledEdit3中輸入Enter就馬上送出 if Key = 13 if LabeledEdit3-Text != LabeledEdit4-Text = NMEcho1-EchoLab

52、eledEdit3-Text; LabeledEdit5-Text = FloatToStrNMEcho1-ElapsedTime + milliseconds; /-void _fastcall TForm1:NMEcho1ConnectTObject *Sender /當連線的時候要做的屬性設(shè)定 BitBtn1-Enabled = false; BitBtn2-Enabled = true; BitBtn3-Enabled = true;/-void _fastcall TForm1:NMEcho1DisconnectTObject *Sender /當斷線的時候要做的屬性設(shè)定 BitBt

53、n1-Enabled = true; BitBtn2-Enabled = false; BitBtn3-Enabled = false;23-5. 一些Client端的小程式 範例23-6:Echo Client範例 執(zhí)行結(jié)果23-5. 一些Client端的小程式 範例23-7:NNTP Client範例 範例說明 NNTP就是我們普通常說的新聞群組或是News Server。 在這個程式中我們只先寫出與主機連線以及獲得Group名稱,並且抓取Group文章的數(shù)量資訊。至於列出Group內(nèi)的文章的標題,還有閱讀文章、發(fā)表文章等等的功能,只需求略微看一下NMNNTP中的各種Event所代表的意義

54、,以及我們要執(zhí)行的動作有哪些屬性,我們就可以很容易的寫出一個完好的NNTP Client端軟體也常被稱做NNTP Reader。 至於News Server還有一些Control Message也只是一封比較特別的文章而已,所以要發(fā)表所謂的Control Message我們只需求略微改一下發(fā)表文章這一部份就可以達到所要的功能。23-5. 一些Client端的小程式 範例23-7:主要程式碼main.cppvoid _fastcall TForm1:FormShowTObject *Sender /當Form顯示的時候抓取Temp Directory,把Temp Directory設(shè)定成Cach

55、e Dir.以及Attach File Dir. LPITEMIDLIST pidl; LPMALLOC pShellMalloc; char szDir512; int CSIDL_STR = CSIDL_TEMPLATES; if SUCCEEDEDSHGetMalloc&pShellMalloc if SUCCEEDEDSHGetSpecialFolderLocationNULL, CSIDL_STR, &pidl if SHGetPathFromIDListpidl, szDir LabeledEdit5-Text = szDir; LabeledEdit6-Text

56、= szDir; pShellMalloc-Freepidl; pShellMalloc-Release; /-void _fastcall TForm1:BitBtn1ClickTObject *Sender /與NNTP Server連線 if LabeledEdit1-Text != & LabeledEdit2-Text != & LabeledEdit5-Text != & LabeledEdit6-Text != /設(shè)定NNTP Client的一些根本資訊 NMNNTP1-ReportLevel = Status_Basic; NMNNTP1-TimeOut

57、 = 20000; NMNNTP1-NewsDir = LabeledEdit5-Text; NMNNTP1-AttachFilePath = LabeledEdit6-Text; NMNNTP1-Host = LabeledEdit1-Text; NMNNTP1-Port = StrToIntLabeledEdit2-Text; /假如NNTP Server需要使用者名稱及密碼,只要有輸入就可以在這邊進行認證 if LabeledEdit3-Text != “ NMNNTP1-UserId = LabeledEdit3-Text; NMNNTP1-Password = LabeledEdit

58、4-Text; NMNNTP1-Connect; /與NNTP Server連線 23-5. 一些Client端的小程式 範例23-7:主要程式碼main.cppvoid _fastcall TForm1:BitBtn2ClickTObject *Sender NMNNTP1-Disconnect; /與NNTP Server斷線/-void _fastcall TForm1:NMNNTP1ConnectTObject *Sender /與Server連線時要做的工作 BitBtn1-Enabled = false; BitBtn2-Enabled = true; StatusBar1-Sim

59、pleText = Connected; /當Client和Server連線之後,要直接呼叫GetGroupList.將Server上的Group抓下來 NMNNTP1-GetGroupList;/-void _fastcall TForm1:NMNNTP1DisconnectTObject *Sender /與Server斷線時要做的工作 BitBtn1-Enabled = true; BitBtn2-Enabled = false; StatusBar1-SimpleText = Disconnected;/-void _fastcall TForm1:NMNNTP1GroupListUp

60、dateAnsiString name, int FirstArticle, int LastArticle, bool Posting ListBox1-Items-Addname; /將GetGroupList抓到的資料放到Memo中23-5. 一些Client端的小程式 範例23-7:主要程式碼main.cppvoid _fastcall TForm1:NMNNTP1GroupListCacheUpdatebool &Handled, AnsiString name, int FirstArticle, int LastArticle, bool Posting /將GetGroupList抓到的資料放到Memo中 ListBox1-Items-Addname;/-void _fastcall TForm1:NMNNTP1StatusTCompone

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論