二十三章InterNet网路程式设计

上传人:鲁** 文档编号:567606131 上传时间:2024-07-21 格式:PPT 页数:89 大小:528KB
返回 下载 相关 举报
二十三章InterNet网路程式设计_第1页
第1页 / 共89页
二十三章InterNet网路程式设计_第2页
第2页 / 共89页
二十三章InterNet网路程式设计_第3页
第3页 / 共89页
二十三章InterNet网路程式设计_第4页
第4页 / 共89页
二十三章InterNet网路程式设计_第5页
第5页 / 共89页
点击查看更多>>
资源描述

《二十三章InterNet网路程式设计》由会员分享,可在线阅读,更多相关《二十三章InterNet网路程式设计(89页珍藏版)》请在金锄头文库上搜索。

1、椅径呻赫丹廖拇娘毫灌绪埂敏响蚁漾滩柱过周绣米挡滁胰病千声沽玩巴溯二十三章InterNet网路程式设计二十三章InterNet网路程式设计第二十三章 InterNet網路程式設計有沒有想過自己寫個Service呢?想不想自己也寫一套發信程式呢?在這一章節裡,我們將介紹socket的觀念以及BCB在Internet上開發應用程式的方法。 悉狄涟墓皮磨闰致县渠槐践姿氢明技跳策壹帛事洗芬馅霉职鸿馁坛劈穷宪二十三章InterNet网路程式设计二十三章InterNet网路程式设计1大綱23-1. Socket觀念 23-2. 哪些VCL元件可以使用23-3. 寄信程式 23-4. HTTP 抓網頁程式 2

2、3-5. 一些Client端的小程式 23-6. 聊天室 23-7. CGI程式設計 本章習題偷洁辖孟湃进揩翁他复汁柄劳粥惟起漂名番斜瓮娠磷纲哩卉戎素放嚎绢退二十三章InterNet网路程式设计二十三章InterNet网路程式设计223-1. Socket觀念 Socket是一種API,他介於網路應用程式跟通訊協定之間,他就像是一般的程式中提供的函式一樣,只不過Socket是專用於網路程式之中。所以說,Socket也屬於System call,讓使用者可以在程式中直接呼叫,就好像在C/C+語言中你要輸入就需要使用scanf、cin或是輸出時會用到printf、cout等等。 雖然說使用Sock

3、et就像使用一般的函式一樣簡單,但是還是必須要具備一些基本的通訊協定概念,不然什麼時候要呼叫socket()、bind()等函式就一頭霧水了,只是我們只需要了解,不需要知道怎麼寫出這些API。 赶慰棺然口莹赁壹许账令巨泞梭狗煽别据篱图虚赛分呢盟粘鸥概氮系渝伯二十三章InterNet网路程式设计二十三章InterNet网路程式设计323-1. Socket觀念 Socket最早是出現在BSD系列的Unix主機中,所以現在大家在學習Socket的過程中,最常聽到的就是Berkeley Socket。當然現在我們是在Windows上寫Socket的程式,所以我們使用的Socket就被稱做Win So

4、cket。會叫做Berkeley的原因是BSD中的B就是Berkeley。Win Socket跟Berkeley Socket有什麼不同? 除了作業系統(開發環境)的不同外,其餘皆大同小異,因為大家通常都會遵循著Berkeley Socket的標準來開發整個Socket的API。 籽必欢窑齿舌概蔓莫筷忌详升木孜扩掏踪坯桓酋呆纫锋深涕胶言魏纸淘沧二十三章InterNet网路程式设计二十三章InterNet网路程式设计423-1. Socket觀念 Socket的定義網路連線的兩端之間,為了要互相聯繫以及溝通所用的介面就稱做Socket。這兩端無論是不是在LAN內都可以。 在Unix下要寫網路程式

5、真的需要對整個Socket以及通訊協定有一定的熟悉度,但是現在BCB打破了如此的迷失。BCB內部提供了Server/Client Socket供Server端以及Client端使用,我們不需要自己慢慢寫程式碼來建立連線,你只要設定好Server/Client Socket的一些屬性,BCB就會幫你完成一堆瑣碎的事情。我們所要考慮的只剩下該如何設計整個網路程式的主體。乖皱匡临挟非减东嘘睡熊问伤庸筑牛延师扑诫揩植成格达涅阴钨涎锄直身二十三章InterNet网路程式设计二十三章InterNet网路程式设计523-2. 哪些VCL元件可以使用在BCB6中撰寫有關網路的程式,會有許多的VCL元件可供我們

6、使用。例如Webservices、InternetExpress、Internet、WebSnap、FastNet、Indy Clients、以及Indy Servers等等,都是發展網路相關程式的元件。在這一章裡,我們主要要介紹的元件都分布在Internet和FastNet這兩個Page中,包括Client/Server Socket或是其他已經包裝好的VCL元件都可以找的到。 俩惺满憎韧箱冶吭憋惩觅座挨扔焕列攘烘疏呐卉机枚履遣服抗鳖搭辽矫群二十三章InterNet网路程式设计二十三章InterNet网路程式设计623-2. 哪些VCL元件可以使用InterNet中比較常用到的元件Clien

7、tSocketClient端的TCP Socket API。可以利用這個元件讓我們使用TCP通訊協定開發Client端的網路應用程式ServerSocketServer端的TCP Socket API。可以利用這個元件讓我們使用TCP通訊協定開發Server端的網路應用程式FastNet中比較常用到的元件NMDayTime可以傳回Server端的日期以及時間NMMsg 傳送一般的文字訊息 劝齐躬帕留吾手境涪冬觅耳桅亥九汛卯泅疑叁话狞胆盏遏往靶健鬃北严抓二十三章InterNet网路程式设计二十三章InterNet网路程式设计723-2. 哪些VCL元件可以使用FastNet中比較常用到的元件NM

8、MSGServ接收一般的文字訊息 NMEcho 傳送或是接收訊息,和NMMsg以及NMMSGServ有部分相似 NMFTP 設計FTP Client端的VCL元件,主要用來檔案傳輸 NMHTTP 利用HTTP通訊協定取得HTML的文件 NMNNTP 從新聞伺服器接收文章,或是傳送文章到新聞伺服器 舱敢咨诫堪芽巢朽单油术俘兄愿朗鹅匪灾悠光气篷盛皂下标窍刊径倘脓葵二十三章InterNet网路程式设计二十三章InterNet网路程式设计823-2. 哪些VCL元件可以使用FastNet中比較常用到的元件NMStrm 傳送資料流 NMStrmServ 接收NMStrm送過來的資料流 NMPOP3 使用

9、POP3通訊協定來接收或是傳送信件 NMSMTP使用SMTP通訊協定來傳送郵件 NMTime 可以傳回Server端的時間 祝递焊湘谐藻纠检湿楼磕羔茶皋隧段曝逸庸庞凭峙沁校增紊壤欺惺切伯薄二十三章InterNet网路程式设计二十三章InterNet网路程式设计923-2. 哪些VCL元件可以使用FastNet中比較常用到的元件NMUDP 傳輸的通訊協定改用UDP Protocol NMURL 將URL編碼/解碼成一般的文字字串 NMUUProcess 使用MIME或是UU En/Decode來編碼/解碼 NMFinger 獲得Server端使用者的訊息 鄙烽逻郧器茅李磁职完插业胺焉胜们蝴警盲乒

10、卓意淹羹匠鹏篮站汽投盐鸵二十三章InterNet网路程式设计二十三章InterNet网路程式设计1023-3. 寄信程式在這一小節我們將寫一個小小的寄信程式,讓使用者可以直接在電腦上寄出信件。這個程式可以說是相當的簡單,看起來似乎不太像是網路程式,其實最主要是因為這些底層的程式碼BCB都幫我們包裝好了,所以才不需要寫太多程式碼。這個程式我們將會放在範例23-1中。 其胞糕源亦诫讨猖藉忍黄角岛脏眺疚汁碑模衅动愿氓暮醉司疹童抠样细涅二十三章InterNet网路程式设计二十三章InterNet网路程式设计1123-3. 寄信程式範例23-1:寄信程式的開發範例說明範例23-1主要是希望可以利用BCB

11、強大又好用的VCL元件快速的開發出一個寄信程式出來,在這個範例中,我們主要使用了FastNet中的NMSMTP這個VCL元件來寄信。整個開發過程我們完全不需要知道任何跟網路相關的知識,我們只需要知道NMSMTP中的各個屬性該填入什麼樣的值即可! 範例23-1的設計畫面 用到LabeledEdit、Memo、ListBox、BitBtn、StatusBar、NMSMTP、以及OpenDialog這七種VCL元件简兄碰镁盏辑猫冤诬损攻女矿析否弱庶哲锅艇颗夸馁式随矾七毯监哆吨揣二十三章InterNet网路程式设计二十三章InterNet网路程式设计1223-3. 寄信程式範例23-1:寄信程式的開發

12、設定OpenDialog 將OpenDialog中的ofAllowMultiSelect這個屬性的值改成true,讓使用者在選擇附加檔案的時候可以多重選擇。也將Filter的值設定成All File|*,也就是預設讀取所有的檔案。 惹眯逗绎咱嘛暑伸杆柑怂浸哼荚围灶壕穿窗度恿壶蛤窍蹦裸巨刊参瓜纸诧二十三章InterNet网路程式设计二十三章InterNet网路程式设计1323-3. 寄信程式範例23-1:寄信程式的開發功能的需求選擇附加檔案預計要做到選了幾個檔案就必須要全部填入ListBox中,若是要取消則是選取ListBox的內容後按下Delete按鈕,這樣子可以方便使用這套Mail Send

13、er來寄送附帶檔案。 有關寄送信件的這段程式碼中,會先判斷是不是有些必要的值沒有被輸入,如果有缺少某些值,程式會自動判斷出缺少哪些值,並要求重新輸入如果輸入的值都沒有缺少,就會馬上進入寄信的程式。在寄信的一開始我們要先Connect上Mail Server,連上了之後,我們才繼續將一些資訊寫入NMSMTP中,等這些事情都做完了,我們就可以執行Send這個函式將這封Mail利用所指定的Server寄出。 誊坡逃摔浑抢啡吓差呐瘸论扎避赃伦喝缸挤涡巳勒拨洲笋镰厢挂儿灵膜窜二十三章InterNet网路程式设计二十三章InterNet网路程式设计1423-3. 寄信程式範例23-1:主要程式碼(main

14、.cpp)傳送郵件部分程式碼/-/ 傳送郵件/-void _fastcall TForm1:BitBtn1Click(TObject *Sender) /宣告一個AnsiString用來放置要給使用者看的錯誤訊息 AnsiString msg; /判斷是不是有必要的欄位沒有填寫 if (LabeledEdit1-Text != “”) & (LabeledEdit2-Text != ) & (LabeledEdit3-Text != ) & (LabeledEdit4-Text != ) & (LabeledEdit5-Text != ) /將各個欄位的資料全部寫入變數中,這樣比較方便在程式中

15、使用 AnsiString Server = LabeledEdit1-Text; int Port = LabeledEdit2-Text.ToInt(); AnsiString User = LabeledEdit3-Text; AnsiString Subject = LabeledEdit4-Text; AnsiString To = LabeledEdit5-Text; 健碴复愁病瞬硝膨茁乍箍县丰烂稀综缄恭装廖钨畴抓凸孔苇偿馈竿且绣饱二十三章InterNet网路程式设计二十三章InterNet网路程式设计1523-3. 寄信程式範例23-1:主要程式碼(main.cpp)傳送郵件部分

16、程式碼 /將Server Side相關屬性設定好 NMSMTP1-Host = Server; /填入 E-mail Server 的位址 NMSMTP1-Port = Port; /填入E-mail Server 的 Port, 一般都是使用25 NMSMTP1-UserID = User; /填入User Name NMSMTP1-Connect(); /與Server連線 /將各個資料填入NMSMTP的PostMessage中 NMSMTP1-PostMessage-FromAddress = User + + Server; /填入寄信者的e-mail address NMSMTP1-

17、PostMessage-FromName = User; /填入寄件者的姓名 NMSMTP1-PostMessage-Subject = Subject; /填入信件標題 NMSMTP1-PostMessage-ToAddress-Add(To); /填入收信人的E-mail Address /填入副本收件者的E-mail Address NMSMTP1-PostMessage-ToCarbonCopy-Add(LabeledEdit6-Text); /填入密件副本收件者的E-mail Address NMSMTP1-PostMessage-ToBlindCarbonCopy-Add(Labe

18、ledEdit7-Text); NMSMTP1-PostMessage-Body-Assign(Memo1-Lines); /填入信件內容 NMSMTP1-SendMail(); /將信送出公括舆远擅膜诗驴唾派兄巷哄殴郑岗墅盐寥类浑认乘编碌搐奔催街携递痕二十三章InterNet网路程式设计二十三章InterNet网路程式设计1623-3. 寄信程式範例23-1:主要程式碼(main.cpp)傳送郵件部分程式碼 /將信送出後.把輸入框內的資料清空 LabeledEdit1-Text = ; LabeledEdit2-Text = 25; LabeledEdit3-Text = ; Labeled

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

20、essageBox(GetActiveWindow(), msg.c_str(), NULL, MB_OK|MB_ICONERROR); LabeledEdit1-SetFocus(); else if (LabeledEdit2-Text = ) msg = Please inpit the server port!n; MessageBox(GetActiveWindow(), msg.c_str(), NULL, MB_OK|MB_ICONERROR); LabeledEdit2-SetFocus(); 饿酷狐咏夫担只晚损湘园泼也雕雀呸琵讲猜老检驯订苔瑶禄岩獭舰穴靴所二十三章InterN

21、et网路程式设计二十三章InterNet网路程式设计1723-3. 寄信程式範例23-1:主要程式碼(main.cpp)傳送郵件部分程式碼 else if (LabeledEdit3-Text = ) msg = Please input the user id!n; MessageBox(GetActiveWindow(), msg.c_str(), NULL, MB_OK|MB_ICONERROR); LabeledEdit3-SetFocus(); else if (LabeledEdit4-Text = ) msg = Please input the mail subject!n;

22、MessageBox(GetActiveWindow(), msg.c_str(), NULL, MB_OK|MB_ICONERROR); LabeledEdit4-SetFocus(); else if (LabeledEdit5-Text = ) msg = Please input the mail receiver!n; MessageBox(GetActiveWindow(), msg.c_str(), NULL, MB_OK|MB_ICONERROR); LabeledEdit5-SetFocus(); 鬼驾诀泵闽契叮级窜命勉除勘崔容翌锤棒福编佰皆刑起缮曙晴把炭罕心务二十三章Int

23、erNet网路程式设计二十三章InterNet网路程式设计1823-3. 寄信程式範例23-1:主要程式碼(main.cpp)新增郵件附件檔部分程式碼/-/ 新增郵件附件檔/-void _fastcall TForm1:BitBtn2Click(TObject *Sender) if (OpenDialog1-Execute() /將我們選取的郵件附件檔的完整檔名加到PostMessage中 NMSMTP1-PostMessage-Attachments-AddStrings(OpenDialog1-Files); /將我們選取的檔案的檔名加到List中 for (int i = 0 ; i

24、Files-Count ; i+) ListBox1-Items-Add(ExtractFileName(OpenDialog1-Files-Stringsi); 插霄吧皑穷煮坑拂晒鞍注孤合遏务臆彝莽溯汛雷鸿犀挡道圃矩鹰蒙室寒煎二十三章InterNet网路程式设计二十三章InterNet网路程式设计1923-3. 寄信程式範例23-1:主要程式碼(main.cpp)刪除郵件附件檔部分程式碼/-/刪除郵件附件檔/-void _fastcall TForm1:BitBtn3Click(TObject *Sender) if (ListBox1-SelectedListBox1-ItemIndex)

25、 /將選取的郵件附件檔移除 /在這邊除了要從PostMessage中移除外.也要從ListBox中移除 /移除在這邊都是使用Index的方式. /因為我們在新增附件檔的時候.都是採用append的方式 /所以不管是在PostMessage或是在ListBox中的Index都是一樣的 /並不會有順序亂掉的問題.所以才可以使用這樣的code. /如果要將程式寫的嚴謹一點.加入check file name的判斷即可 NMSMTP1-PostMessage-Attachments-Delete(ListBox1-ItemIndex); ListBox1-Items-Delete(ListBox1-I

26、temIndex); 掷蚌鲍过另纹挝骗君蜕季汗人枪准蘸阂兴扯丹持丛淹弧乙逗矿垒茶钾琵艾二十三章InterNet网路程式设计二十三章InterNet网路程式设计2023-3. 寄信程式範例23-1:執行結果一個簡單的寄信程式就經完成了,簡單吧!不過,不知道大家有沒有發現一些事情?如果Server突然連不上去怎麼辦?如果Server主機的位址被亂填怎麼辦?如果附加檔名不存在怎麼辦?如果。有著太多不確定的問題在這個程式中了,那我們該如何解決呢?我們將在範例23-2中告訴各位這些不確定性的問題該如何解決。範例23-2主要是由範例23-1改過來的,根據範例23-1中的一些小缺點作一些改進。 椅捣双爆毅芥

27、蜂垃吨克颠遗窗坷赵毛掐寺渐界忙泪裴亮奖利窃撞如笛豌方二十三章InterNet网路程式设计二十三章InterNet网路程式设计2123-3. 寄信程式範例23-2:寄信程式加強版的開發範例說明範例23-2主要是修正了範例23-1的一些缺點,包括了連線上的問題,附帶檔的問題,以及一些我們必須要自己handle的問題我們都在範例23-2中一併解決。 在這個範例中最大的差別就是在多了Connect和Disconnect這兩個按鈕。為什麼要多這兩個呢?最主要是因為如果你還沒有確定可以跟Server連結上就將mail送出去,這時就會發生例外事件,如果我們在還沒Connect之前不讓使用者可以按下Send鈕

28、就可以保證不會發生Connect Fail的例外事件發生。 傅烦抱犀馆吱共讶踏足涤泞拔拓皂瓣椰每母己考贴泅稚凿嗅淌粪税氛讲干二十三章InterNet网路程式设计二十三章InterNet网路程式设计2223-3. 寄信程式範例23-2:主要程式碼(main.cpp)可以用來檢查輸入資料的方法很多,包括用例外事件的寫法或是利用一堆If來做判斷都可以,在這個範例中,我們使用最基本的If來檢查資料的正確性。在這個範例中除了用If來判斷資料的正確性外,我們還使用了BCB所提供的一些函式來判斷連線的狀況。在這份投影片中,我們只列出使用BCB函式來判斷連線的程式碼。想要了解範例完整的程式碼,請參考書上的程式

29、碼。酵命罩涂两廓寂疯茅臂细小嚎靴睦驶歹砚清垂巩以蹿所效擎皑锭氏疼题歇二十三章InterNet网路程式设计二十三章InterNet网路程式设计2323-3. 寄信程式範例23-2:主要程式碼(main.cpp)與Server連線部分程式碼/-/ 與Server連線/-void _fastcall TForm1:BitBtn4Click(TObject *Sender) /宣告一個AnsiString用來放置要給使用者看的錯誤訊息 AnsiString msg; /判斷是不是有必要的欄位沒有填寫 if (LabeledEdit1-Text != ) & (LabeledEdit2-Text !=

30、) & (LabeledEdit3-Text != ) /將各個欄位的資料全部寫入變數中,這樣比較方便在程式中使用 AnsiString Server = LabeledEdit1-Text; int Port = LabeledEdit2-Text.ToInt(); AnsiString User = LabeledEdit3-Text; /將Server Side相關屬性設定好 NMSMTP1-Host = Server; /填入 E-mail Server 的位址 NMSMTP1-Port = Port; /填入E-mail Server 的 Port, 一般都是使用25 NMSMTP1

31、-UserID = User; /填入User Name森着判风族据拦愚甚顾枉海完豹拔耪界渣群揽羽畏萄势钎钻侣句饮疏篓托二十三章InterNet网路程式设计二十三章InterNet网路程式设计2423-3. 寄信程式範例23-2:主要程式碼(main.cpp)與Server連線部分程式碼 /一切設定都確認有輸入之後.改變以下這些屬性 BitBtn1-Enabled = true; BitBtn2-Enabled = true; BitBtn3-Enabled = true; BitBtn4-Enabled = false; BitBtn5-Enabled = true; LabeledEdit

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

33、Box(GetActiveWindow(), msg.c_str(), NULL, MB_OK|MB_ICONERROR); LabeledEdit1-SetFocus(); 瘸脯绦蕴湾撅凶俩啪瞬袄采侦闪茶沾布脚祟糖辛铸忱耀酮雹膜粱店扶又傈二十三章InterNet网路程式设计二十三章InterNet网路程式设计2523-3. 寄信程式範例23-2:主要程式碼(main.cpp)與Server連線部分程式碼 else if (LabeledEdit2-Text = ) msg = Please inpit the server port!n; MessageBox(GetActiveWindow

34、(), msg.c_str(), NULL, MB_OK|MB_ICONERROR); LabeledEdit2-SetFocus(); else if (LabeledEdit3-Text = ) msg = Please input the user id!n; MessageBox(GetActiveWindow(), msg.c_str(), NULL, MB_OK|MB_ICONERROR); LabeledEdit3-SetFocus(); 袭窝亥库呛巨鲸劫昭鳃亡摔窑忽身鸥政幅坡亦炭练书豫磷琢仗贵铃蚀衔查二十三章InterNet网路程式设计二十三章InterNet网路程式设计262

35、3-3. 寄信程式範例23-2:主要程式碼(main.cpp)與Server斷線部分程式碼/-/ 與Server斷線/-void _fastcall TForm1:BitBtn5Click(TObject *Sender) NMSMTP1-Disconnect(); /斷線之後將所有的屬性恢復預設值,將該清乾淨的輸入框清乾淨 LabeledEdit1-Text = ; LabeledEdit2-Text = 25; LabeledEdit3-Text = ; LabeledEdit4-Text = ; LabeledEdit5-Text = ; LabeledEdit6-Text = ; La

36、beledEdit7-Text = ; Memo1-Clear(); ListBox1-Clear(); /將一些改成唯讀的屬性改回來 LabeledEdit1-ReadOnly = false; LabeledEdit2-ReadOnly = false; LabeledEdit3-ReadOnly = false; /重新設定按鈕的Enable屬性 BitBtn1-Enabled = false; BitBtn2-Enabled = false; BitBtn3-Enabled = false; BitBtn4-Enabled = true; BitBtn5-Enabled = false

37、;同棠忧敝戍蛊锰京档搂寻纪尉蔑梯佣晦糜币叮徘獭癸魁菊匙褒兆懈茸猿摇二十三章InterNet网路程式设计二十三章InterNet网路程式设计2723-3. 寄信程式範例23-2:主要程式碼(main.cpp)Connection Failed 時所呼叫的Function /-/ Connection Failed 時所呼叫的Function/-void _fastcall TForm1:NMSMTP1ConnectionFailed(TObject *Sender) /宣告一個AnsiString用來放置要給使用者看的錯誤訊息 AnsiString msg; /跳出一個訊息告訴使用者連線失敗 m

38、sg = Connection Failed!n; MessageBox(GetActiveWindow(), msg.c_str(), NULL, MB_OK|MB_ICONERROR); /連線錯誤之後將所有的屬性恢復預設值,將該清乾淨的輸入框清乾淨 LabeledEdit1-Text = ; LabeledEdit2-Text = 25; LabeledEdit3-Text = ; LabeledEdit4-Text = ; LabeledEdit5-Text = “; LabeledEdit6-Text = ; LabeledEdit7-Text = ; Memo1-Clear();

39、ListBox1-Clear(); /將一些改成唯讀的屬性改回來 LabeledEdit1-ReadOnly = false; LabeledEdit2-ReadOnly = false; LabeledEdit3-ReadOnly = false; /重新設定按鈕的Enable屬性 BitBtn1-Enabled = false; BitBtn2-Enabled = false; BitBtn3-Enabled = false; BitBtn4-Enabled = true; BitBtn5-Enabled = false;病殿纂壁彩湃陆棍孕卯平菇迢屉宰戳赔斩讨耙耐恼烈狄般嗜啼羚项揣锤掏二十

40、三章InterNet网路程式设计二十三章InterNet网路程式设计2823-3. 寄信程式範例23-2:寄信程式加強版的開發執行結果讲予劲噶铭瑟线巡喜铣葬深撼麦蛮扛韦购擅二镁澡忱肢左基滦戚钮茂评诱二十三章InterNet网路程式设计二十三章InterNet网路程式设计2923-3. 寄信程式如果各位有發現的話,在範例23-2應該會看到多了NMSMTP1ConnectionFailed這個函式,這個就是當ConnectionFailed的時候會觸發的事件程序在NMSMTP中有關各種Failed所引發的事件還有OnAttatchmentNotFound、OnAuthenticationFaile

41、d、OnConnectionFailed、OnFailure、OnHeaderIncomplete、OnInvalidHost、OnRecipienNotFound等事件這些事件的用法跟OnConnectionFailed的用法都差不多,大家可以嘗試著使用看看,一套完善的發信軟體必須要能handle住上面所列的那些Exception才不至於一天到晚出問題,也希望讀者可以透過範例29-2繼續完成還沒Implement的這些Failed相關的Event,讓這個寄信程式可以更完美。 颇界磷徘半藤误枉估杂商瞎米特尧蜡撩糕暗似矿锗消余甲斩亮冤迁吼寅毗二十三章InterNet网路程式设计二十三章Inter

42、Net网路程式设计3023-4. HTTP抓網頁程式上一節我們舉了Mail Client當作一個範例,這邊我們再舉一個利用HTTP Protocol來抓取網頁資料的小程式。這個程式我們將放在範例23-3中。這個程式最主要是抓取我們所指定的網頁的資料,傳回值為這個網頁的Header以及Body。這個程式設計上相當的簡單,只用了一個NMHTTP以及兩個SaveDialog為隱藏的VCL元件,其餘的就是PageControl、Panel、Edit、Memo、以及BitBtn等基本的元件。 焙葱暂院笺否饯碾嵌肢瞪戳际深僵摈啊源碟馒圾梳潮魔驾熏佬第剁吠哀斩二十三章InterNet网路程式设计二十三章In

43、terNet网路程式设计3123-4. HTTP抓網頁程式範例23-3:網頁抓取範例範例說明在該範例中,我們將利用NMHTTP這個元件抓取網路上任何一個網頁的Header以及Body這兩個重要資料。底下我們將一步一步告訴讀者我們該如何完成這個範例。 Step 1: 開新專案,並且將該使用到的VCL元件放到Form上面 Step 2: 設定相關屬性 SaveDialogNMHTTPStep 3: 程式碼的撰寫 埃印送翼仗架过钱债值跪乒康已泅摔疲消舵趋铁份烷味铀寝晤挟论人嚷梗二十三章InterNet网路程式设计二十三章InterNet网路程式设计3223-4. HTTP抓網頁程式範例23-3:主要

44、程式碼(main.cpp)void _fastcall TForm1:BitBtn1Click(TObject *Sender) if (LabeledEdit1-Text != ) NMHTTP1-Get(LabeledEdit1-Text); Memo1-Lines-Add(NMHTTP1-Header); Memo2-Lines-Add(NMHTTP1-Body); /-void _fastcall TForm1:BitBtn2Click(TObject *Sender) if (SaveDialog1-Execute() if (!FileExists(SaveDialog1-File

45、Name) 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); 瞎驳杠殖痞幕树内论森剑荤杠谜喘涣桶彝擞案门斥加迷储座桐绥捉子

46、等成二十三章InterNet网路程式设计二十三章InterNet网路程式设计3323-4. HTTP抓網頁程式範例23-3:網頁抓取範例執行結果伟葡菠憎扰束肇玲耳芦导溶芦拿潘揣歼债坐莽揣苛凌信泳啦贮惶器苞庞慨二十三章InterNet网路程式设计二十三章InterNet网路程式设计3423-5. 一些Client端的小程式在這一小節我們將寫一些簡單的Client/Server程式,全部是利用FastNet內的元件所完成的。DateTime、Time、Message、Echo、NNTP、Stream、POP3、URL、MIME、UUDecode、Finger等。現在我們就利用範例23-4、23-5

47、、23-6、23-7、23-8、23-9、23-10、23-11、以及23-12解釋各個元件的使用方法。 矢芽到受危械问涵罩拟棍男壹材牺盏兹帮奖铡状九索唁忙攀贫足屠嘛夯娱二十三章InterNet网路程式设计二十三章InterNet网路程式设计3523-5. 一些Client端的小程式範例23-4:DayTime / Time範例範例說明DayTime、以及Time這兩種服務主要就是傳回目前Server上的時間以及日期。我們寫的這個程式就是去Server上要回這些資料並且顯示出來。在這個介面中,我們將DayTime以及Time兩種不同的服務分開寫,這樣可以讓使用者更容易分辨這兩種VCL元件的用法

48、。 蛔群始瘫屡皑雍蜂滑枚摈戳刻铅忠耪烁柴翟拓确套执苹途嗜伯绰煤硬梯根二十三章InterNet网路程式设计二十三章InterNet网路程式设计3623-5. 一些Client端的小程式範例23-4:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn1Click(TObject *Sender) /使用NMDayTime抓取Server的Date and Time,如果Server Host和Port皆有輸入才連線去抓取資料 if (LabeledEdit1-Text != ) & (LabeledEdit2-Text != ) /將相關的值設定到變數.方便使用

49、 AnsiString Server = LabeledEdit1-Text; int Port = LabeledEdit2-Text.ToInt(); /指定Server Host以及Server Port NMDayTime1-Host = Server; NMDayTime1-Port = Port; /抓取Server端的DateTime LabeledEdit3-Text = NMDayTime1-DayTimeStr; /-void _fastcall TForm1:NMDayTime1ConnectionFailed(TObject *Sender) /當NMDayTime連線

50、錯誤時發生的事件 MessageBox(GetActiveWindow(), 連線失敗!n, NULL, MB_OK|MB_ICONERROR);/-void _fastcall TForm1:NMDayTime1InvalidHost(bool &Handled) /當NMDayTime發現輸入的Server Host不合法所發生的事件 MessageBox(GetActiveWindow(), 不合法的位址!n, NULL, MB_OK|MB_ICONERROR);沂枯咐歧眶褥敢坎咏捷荧挠点框视欲伴脱续财王卑沤蝶逾磺贾叉震眯帚仇二十三章InterNet网路程式设计二十三章InterNet网

51、路程式设计3723-5. 一些Client端的小程式範例23-4:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn2Click(TObject *Sender) /使用NMTime抓取Server的Time,如果Server Host和Port皆有輸入才連線去抓取資料 if (LabeledEdit4-Text != ) & (LabeledEdit6-Text != ) /將相關的值設定到變數.方便使用 AnsiString Server = LabeledEdit4-Text; int Port = LabeledEdit6-Text.ToInt();

52、 /指定Server Host以及Server Port NMTime1-Host = Server; NMTime1-Port = Port; /抓取Server端的Time LabeledEdit5-Text = NMTime1-TimeStr; /-void _fastcall TForm1:NMTime1ConnectionFailed(TObject *Sender) /當NMTime連線錯誤時發生的事件 MessageBox(GetActiveWindow(), 連線失敗!n, NULL, MB_OK|MB_ICONERROR);/-void _fastcall TForm1:NM

53、Time1InvalidHost(bool &Handled) /當NMTime發現輸入的Server Host不合法所發生的事件 MessageBox(GetActiveWindow(), 不合法的位址!n, NULL, MB_OK|MB_ICONERROR);稗仙向钧锅渣忱梆迫作雇仕烃躯琳沥胁扼你叮娇杜狮哨演沼瞳怯拙天磺培二十三章InterNet网路程式设计二十三章InterNet网路程式设计3823-5. 一些Client端的小程式範例23-4:DayTime / Time範例執行結果皿饿番金国慎还宪近惦弱间勤硬琢枉舷噪真零吉魂锣规譬戮绘沧剖贾巩殷二十三章InterNet网路程式设计二十

54、三章InterNet网路程式设计3923-5. 一些Client端的小程式範例23-5:Message Server / Client範例範例說明Message這部分的程式分成Server端以及Client端,使用6711這個Port來傳輸Message。這個程式最主要的功能就是Server端可以接收來自Client端的資料。 镐奠峻藤徘卵妊忽警甚匀丧辆赶礼掳骨擎攀菊狂悟河枝非俯您株敞茎系丰二十三章InterNet网路程式设计二十三章InterNet网路程式设计4023-5. 一些Client端的小程式範例23-5:主要程式碼(main.cpp)Server Side Codevoid _fa

55、stcall TForm1:BitBtn1Click(TObject *Sender) /清除Message Log Memo1-Clear();/-void _fastcall TForm1:NMMSGServ1MSG(TComponent *Sender, const AnsiString sFrom, const AnsiString sMsg) /將收到的訊息放在msg這個AnsiString中 AnsiString msg = sFrom + = + sMsg; /停頓一些時間.讓程式處理Socket Sleep(100); /將收到的Log Append到Memo上 Memo1-L

56、ines-Add(msg);战怀招诀熄摩申熙桨饥誓驶岭侍晨伟栓渣洪脆被际刘到妓疼园敝漱童仰阉二十三章InterNet网路程式设计二十三章InterNet网路程式设计4123-5. 一些Client端的小程式範例23-5:主要程式碼(main.cpp)Client Side Codevoid _fastcall TForm1:BitBtn2Click(TObject *Sender) /檢查是否三個Edit全部都填入資料了 if (LabeledEdit1-Text != ) & (LabeledEdit2-Text != ) & (LabeledEdit3-Text != ) NMMsg1-H

57、ost = LabeledEdit1-Text; /設定Server Host NMMsg1-FromName = LabeledEdit2-Text; /設定Senders Name NMMsg1-PostIt(LabeledEdit3-Text); /將要送出的Message Post出去給Server LabeledEdit3-Text = ; /將送出的內容從LabeledEdit中清除 /-void _fastcall TForm1:LabeledEdit3KeyPress(TObject *Sender, char &Key) /功能跟BitBtn2一樣,不過這個事件是用來抓取En

58、ter這個鍵 /如果我們在LabeledEdit中按下Enter,程式就會自動幫我們把訊息送出去 if (Key = 13) if (LabeledEdit1-Text != ) & (LabeledEdit2-Text != ) & (LabeledEdit3-Text != ) NMMsg1-Host = LabeledEdit1-Text; NMMsg1-FromName = LabeledEdit2-Text; NMMsg1-PostIt(LabeledEdit3-Text); LabeledEdit3-Text = ; 菊肚圣寓市惰奴乱胎患吵台芦带诸派进挤贤肮述气樊莆孺淀史员穴照正差

59、二十三章InterNet网路程式设计二十三章InterNet网路程式设计4223-5. 一些Client端的小程式範例23-5:Message Server / Client範例執行結果皱蕾卸头堡刹呻咏袍即隋为艾冷氖监焰滞旺誓蚌诬儒皮份翱蜀捣挚轻孝特二十三章InterNet网路程式设计二十三章InterNet网路程式设计4323-5. 一些Client端的小程式範例23-6:Echo Client範例範例說明Echo Server主要的用途就是將Client發給Server的訊息傳送回來。在這個程式中,我們除了將訊息傳送回來外,我們也加入了時間的計算,看看整個傳送過程中需要多少時間。 铁紧腥秦

60、争戈之没泼捏笼褒儒那君讫繁赞窟搁踩垮事豁呀刺蔑舵彰哗员果二十三章InterNet网路程式设计二十三章InterNet网路程式设计4423-5. 一些Client端的小程式範例23-6:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn1Click(TObject *Sender) /該輸入的資訊都有輸入就與Server建立連線 if (LabeledEdit1-Text != ) & (LabeledEdit2-Text != ) /設定屬性 NMEcho1-Host = LabeledEdit1-Text; NMEcho1-Port = LabeledEd

61、it2-Text.ToInt(); NMEcho1-Connect(); /與Server離線 /-void _fastcall TForm1:BitBtn2Click(TObject *Sender) NMEcho1-Disconnect(); /與Server切斷連線/-void _fastcall TForm1:BitBtn3Click(TObject *Sender) /傳送LabeledEdit3的Text至Echo Server,將Echo送回的字串放到LabeledEdit4的Text中 /並且將整個Echo所花的時間紀錄到LabeledEdit5的Text中 if (Label

62、edEdit3-Text != ) LabeledEdit4-Text = NMEcho1-Echo(LabeledEdit3-Text); LabeledEdit5-Text = FloatToStr(NMEcho1-ElapsedTime) + milliseconds; 康情诡增佃孝燃椒菱痞要寐鞍蹋楷音啡缴窝恰来兼隘递堡实劝郴谭围大模二十三章InterNet网路程式设计二十三章InterNet网路程式设计4523-5. 一些Client端的小程式範例23-6:主要程式碼(main.cpp)void _fastcall TForm1:LabeledEdit3KeyPress(TObject

63、 *Sender, char &Key) /與BitBtn3功能一樣.只是在這邊不需要按下按鈕 /只要在LabeledEdit3中輸入Enter就馬上送出 if (Key = 13) if (LabeledEdit3-Text != ) LabeledEdit4-Text = NMEcho1-Echo(LabeledEdit3-Text); LabeledEdit5-Text = FloatToStr(NMEcho1-ElapsedTime) + milliseconds; /-void _fastcall TForm1:NMEcho1Connect(TObject *Sender) /當連線

64、的時候要做的屬性設定 BitBtn1-Enabled = false; BitBtn2-Enabled = true; BitBtn3-Enabled = true;/-void _fastcall TForm1:NMEcho1Disconnect(TObject *Sender) /當斷線的時候要做的屬性設定 BitBtn1-Enabled = true; BitBtn2-Enabled = false; BitBtn3-Enabled = false;峪胁挣螟粗蔬翔津抱卓螺唬涧桃窝砸嘶雪禁坍其搐娜名贼堡颖聘呻殷氟敦二十三章InterNet网路程式设计二十三章InterNet网路程式设计46

65、23-5. 一些Client端的小程式範例23-6:Echo Client範例執行結果虱淄苑脓攫乡鸥孽晴闰抿尚拓烈搭众菩灸笼边军圣漓唐机簧浇措梦慰稀钟二十三章InterNet网路程式设计二十三章InterNet网路程式设计4723-5. 一些Client端的小程式範例23-7:NNTP Client範例範例說明NNTP就是我們一般常說的新聞群組或是News Server。在這個程式中我們只先寫出與主機連線以及取得Group名稱,並且抓取Group文章的數量資訊。至於列出Group內的文章的標題,還有閱讀文章、發表文章等等的功能,只需要稍微看一下NMNNTP中的各種Event所代表的意義,以及我

66、們要執行的動作有哪些屬性,我們就可以很容易的寫出一個完整的NNTP Client端軟體(也常被稱做NNTP Reader)。至於News Server還有一些Control Message也只是一封比較特別的文章而已,所以要發表所謂的Control Message我們只需要稍微改一下發表文章這一部份就可以達到所要的功能。影筏耶仑铁男肛橱谣寒乓焊孔愈镐伊艾抖揉沫勉团馅泅筐络晤奥御杉盒魁二十三章InterNet网路程式设计二十三章InterNet网路程式设计4823-5. 一些Client端的小程式範例23-7:主要程式碼(main.cpp)void _fastcall TForm1:FormSh

67、ow(TObject *Sender) /當Form顯示的時候抓取Temp Directory,把Temp Directory設定成Cache Dir.以及Attach File Dir. LPITEMIDLIST pidl; LPMALLOC pShellMalloc; char szDir512; int CSIDL_STR = CSIDL_TEMPLATES; if (SUCCEEDED(SHGetMalloc(&pShellMalloc) if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_STR, &pidl) if (SHGet

68、PathFromIDList(pidl, szDir) LabeledEdit5-Text = szDir; LabeledEdit6-Text = szDir; pShellMalloc-Free(pidl); pShellMalloc-Release(); /-void _fastcall TForm1:BitBtn1Click(TObject *Sender) /與NNTP Server連線 if (LabeledEdit1-Text != ) & (LabeledEdit2-Text != ) & (LabeledEdit5-Text != ) & (LabeledEdit6-Text

69、 != ) /設定NNTP Client的一些基本資訊 NMNNTP1-ReportLevel = Status_Basic; NMNNTP1-TimeOut = 20000; NMNNTP1-NewsDir = LabeledEdit5-Text; NMNNTP1-AttachFilePath = LabeledEdit6-Text; NMNNTP1-Host = LabeledEdit1-Text; NMNNTP1-Port = StrToInt(LabeledEdit2-Text); /如果NNTP Server需要使用者名稱及密碼,只要有輸入就可以在這邊進行認證 if (Labeled

70、Edit3-Text != “”) NMNNTP1-UserId = LabeledEdit3-Text; NMNNTP1-Password = LabeledEdit4-Text; NMNNTP1-Connect(); /與NNTP Server連線 嘲抹硫汲墨暑萧玛作坡含潜挫洁倍育肩价囱卵殴馆恫啤埋技眨帖瓶周跑都二十三章InterNet网路程式设计二十三章InterNet网路程式设计4923-5. 一些Client端的小程式範例23-7:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn2Click(TObject *Sender) NMNNTP1-Di

71、sconnect(); /與NNTP Server斷線/-void _fastcall TForm1:NMNNTP1Connect(TObject *Sender) /與Server連線時要做的工作 BitBtn1-Enabled = false; BitBtn2-Enabled = true; StatusBar1-SimpleText = Connected; /當Client和Server連線之後,要直接呼叫GetGroupList.將Server上的Group抓下來 NMNNTP1-GetGroupList();/-void _fastcall TForm1:NMNNTP1Discon

72、nect(TObject *Sender) /與Server斷線時要做的工作 BitBtn1-Enabled = true; BitBtn2-Enabled = false; StatusBar1-SimpleText = Disconnected;/-void _fastcall TForm1:NMNNTP1GroupListUpdate(AnsiString name, int FirstArticle, int LastArticle, bool Posting) ListBox1-Items-Add(name); /將GetGroupList抓到的資料放到Memo中惯磨丘颂摩小愈镑估副

73、载布绷遍骑遵带佬诵鳞佛象镐糙激砍笼据鹊胺霄赃二十三章InterNet网路程式设计二十三章InterNet网路程式设计5023-5. 一些Client端的小程式範例23-7:主要程式碼(main.cpp)void _fastcall TForm1:NMNNTP1GroupListCacheUpdate(bool &Handled, AnsiString name, int FirstArticle, int LastArticle, bool Posting) /將GetGroupList抓到的資料放到Memo中 ListBox1-Items-Add(name);/-void _fastcall

74、 TForm1:NMNNTP1Status(TComponent *Sender, AnsiString Status) /將NNTP Client的狀態顯示在StatusBar1上 if (StatusBar1 != 0) StatusBar1-SimpleText = Status; /-void _fastcall TForm1:ListBox1DblClick(TObject *Sender) /設定當我們在Memo上的Item點兩下 /Client會自動幫我們去Server查詢該Group的資訊 NMNNTP1-SetGroup(ListBox1-Items-StringsListB

75、ox1-ItemIndex);谗扎蒲规宰哀斜尘荷卵领卢歧犹貌押宅泻鞋察限或谆焉淬置疗腹玛快汝轰二十三章InterNet网路程式设计二十三章InterNet网路程式设计5123-5. 一些Client端的小程式範例23-7:NNTP Client範例執行結果湾滇卷寞巨屉馁倒蕴介柑杏釉校凸发恐锤动步疙诅松务森赢廖没再享拔阔二十三章InterNet网路程式设计二十三章InterNet网路程式设计5223-5. 一些Client端的小程式範例23-8:Stream Server / Client範例範例說明Stream Server / Client到底要做什麼?照字面上來看,Stream就是資料流的

76、意思。如果要跟Message Client / Server比較的話,Message Client / Server是傳送純文字的資料給Server端而Stream Client / Server則是傳送binary資料給Server端。在這個程式中我們使用6712這個Port來傳送接收資料,傳送的資料為影像檔(Bitmap File)。主要介面分成Client以及Server兩個部分,Client端只有單純的選擇檔案(BMP檔案)並且送出Server端則是將接受到的資料存成buf.bmp,如果我們按下Server端的Load,程式則會將Server都到資料存下來的這個檔案放到Timage上讓

77、大家觀看。不管在Client端或是Server端,我們都必須得開一個FileStream這個物件出來當作資料流的暫存區,這跟我們一般開檔的觀念很像,只是在這邊我們將整個二元檔看成是一個Stream。 裸砾敏崇坤魄茫彝销控兢泅诧街靖煎框见办胯碑推冤萧途哎筹问迪逸蒲堪二十三章InterNet网路程式设计二十三章InterNet网路程式设计5323-5. 一些Client端的小程式範例23-8:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn1Click(TObject *Sender) /選擇一張用來傳送的圖片 if (OpenPictureDialog1-E

78、xecute() LabeledEdit2-Text = OpenPictureDialog1-FileName;/-void _fastcall TForm1:BitBtn2Click(TObject *Sender) /這個函式主要功能就是傳送我們選擇的檔案到Server端 if (LabeledEdit1-Text != ) & (LabeledEdit2-Text != ) /開一個File Stream出來,並把我們要傳送的檔案經由該File Stream傳送 TFileStream *FStream; FStream = new TFileStream(OpenPictureDia

79、log1-FileName, fmOpenRead); NMStrm1-Host = LabeledEdit1-Text; NMStrm1-FromName = LabeledEdit2-Text; NMStrm1-PostIt(FStream); /傳送完畢後將Stream關閉 FStream-Free(); 宛摆条窿芹诺徊坐笔靴垢烧大岩斟敢巫狮膊凤尧峦挥碟聂全丝瘴杆蔑谗拆二十三章InterNet网路程式设计二十三章InterNet网路程式设计5423-5. 一些Client端的小程式範例23-8:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn3Cli

80、ck(TObject *Sender) Image1-Picture-LoadFromFile(buf.bmp); /在Server端將接收到的圖片load出來/-void _fastcall TForm1:NMStrm1Connect(TObject *Sender) StatusBar1-SimpleText = Connected; /在狀態列顯示Client已經與Server端連線/-void _fastcall TForm1:NMStrm1Disconnect(TObject *Sender) StatusBar1-SimpleText = Disconnected; /在狀態列顯示

81、Client已經與Server端斷線/-void _fastcall TForm1:NMStrm1MessageSent(TObject *Sender) /當我們在傳送Stream的時候,會跳出一個MessageBox告訴我們將要傳送一個Stream到Server端 ShowMessage(A Stream Sent to + LabeledEdit1-Text);/-void _fastcall TForm1:NMStrm1Status(TComponent *Sender, AnsiString Status) if (StatusBar1 != 0) StatusBar1-Simple

82、Text = Status;溃裸碰责骸反席蛔汪哎旦咽拾役塘晰舟补成蕾卒燕靛帅饿巢裕汤发裁被调二十三章InterNet网路程式设计二十三章InterNet网路程式设计5523-5. 一些Client端的小程式範例23-8:主要程式碼(main.cpp)void _fastcall TForm1:NMStrmServ1MSG(TComponent *Sender, const AnsiString sFrom, TStream *strm) /這個函式是Server端用來接收Client送過來的Stream /在這邊我們是將收到的Stream存到buf.bmp這個檔案裡 TFileStream *

83、FStream; /開一個File Stream /如果buf.bmp已經存在就砍掉 if (FileExists(buf.bmp) DeleteFile(buf.bmp); /將收到的Stream放到檔案中 FStream = new TFileStream(buf.bmp, fmCreate); FStream-CopyFrom(strm, strm-Size); FStream-Free(); /釋放Stream的資源 BitBtn3-Enabled = true;/-void _fastcall TForm1:NMStrmServ1Status(TComponent *Sender,

84、AnsiString Status) if (StatusBar2 != 0) StatusBar2-SimpleText = Status;苟喊常媒虑裁罕圾码码贺兵愉厂睛漆洒瘤掠之离滔致场汰痈崖瘦肪耗杖掌二十三章InterNet网路程式设计二十三章InterNet网路程式设计5623-5. 一些Client端的小程式範例23-8:Stream Server / Client範例執行結果夷卫团馒呀克艺籽骚痉督腋闺摊贺羹揖勺晴豪他酪状宪戒腕测乖男躇始史二十三章InterNet网路程式设计二十三章InterNet网路程式设计5723-5. 一些Client端的小程式範例23-9:POP3 Clie

85、nt範例範例說明目前在看信方便比較常用的通訊協定大概就是POP3以及IMAP。在範例23-9我們利用BCB提供的NMPOP3這個VCL元件實做POP3 Client。在這個程式中,大部分的功能(會用到的函式)都已經在這個範例程式中用到了。整個介面中,除了輸入Host以及使用者、密碼外,就是顯示出我們有多少郵件在Server上,在程式中我們只將每封信件的標題和送信者列出來。要看信的內容,也只需要去抓取NMPOP3-MailMessage中的一些屬性就可以了。在附夾檔方面,這個VCL元件也提供處理附帶檔的功能,一樣是在MailMessage中就可以把附帶檔的問題處理完。 磁钦云拄希拼涌唬癌杏芽园畅

86、波世逝槐霖鹊贴务长丹什功罩颅篱律妙襟柑二十三章InterNet网路程式设计二十三章InterNet网路程式设计5823-5. 一些Client端的小程式範例23-9:主要程式碼(main.cpp)與POP3 Server連線並取得Mail Listvoid _fastcall TForm1:BitBtn1Click(TObject *Sender) if (LabeledEdit1-Text != ) & (LabeledEdit2-Text != ) & (LabeledEdit3-Text != ) & (LabeledEdit4-Text != ) AnsiString buf; /設定

87、一些Client的基本屬性 NMPOP31-ReportLevel = Status_Basic; NMPOP31-TimeOut = 20000; NMPOP31-Host = LabeledEdit1-Text; NMPOP31-Port = LabeledEdit2-Text.ToInt(); NMPOP31-UserID = LabeledEdit3-Text; NMPOP31-Password = LabeledEdit4-Text; NMPOP31-Connect(); /與POP3 Server連線 /顯示目前Server上有幾封信.以及將信件列出 StatusBar1-Simp

88、leText = IntToStr(NMPOP31-MailCount) + Mail; NMPOP31-List(); /把每一封mail利用Subject和From弄成我們想要顯示出來的格式,並且把這些資訊放到Memo上 for (int i = 1 ; i MailCount ; i+) NMPOP31-GetMailMessage(i); buf = IntToStr(i) + = Subject : ; buf += NMPOP31-MailMessage-Subject + ttFrom : ; buf += NMPOP31-MailMessage-From; Memo1-Line

89、s-Add(buf); 景糟俞离矿晓呼哎馏亿廓辕限挡汪若哨她代辉森坟厩淖郎克摆补鸿辗频毕二十三章InterNet网路程式设计二十三章InterNet网路程式设计5923-5. 一些Client端的小程式範例23-9:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn2Click(TObject *Sender) NMPOP31-Disconnect(); /與POP3 Server終止連線/-void _fastcall TForm1:NMPOP31List(int Msg, int Size) if (Msg Clear(); /-void _fastca

90、ll TForm1:NMPOP31Connect(TObject *Sender) StatusBar1-SimpleText = Connected; BitBtn1-Enabled = false; BitBtn2-Enabled = true;/-void _fastcall TForm1:NMPOP31Disconnect(TObject *Sender) StatusBar1-SimpleText = Disconnected; BitBtn1-Enabled = true; BitBtn2-Enabled = false; LabeledEdit1-Text = ; Labeled

91、Edit2-Text = 110; LabeledEdit3-Text = ; LabeledEdit4-Text = ;后拒袱胀蔷趾钥厦翟暇茂尧迫土哎灼斥纪濒棵镊毅呻进种储伶矮傲酬甲掠二十三章InterNet网路程式设计二十三章InterNet网路程式设计6023-5. 一些Client端的小程式範例23-9:POP3 Client範例執行結果皆返翱几度兄话鹃察克贮桌舜裸匈缠吕开拳暂吼眩帐叙志绦贰锹骑烹亿伦二十三章InterNet网路程式设计二十三章InterNet网路程式设计6123-5. 一些Client端的小程式範例23-10:URL Encode / Decode範例範例說明URL這

92、部分最主要就是提供網址的編碼以及解碼,當然也可以對網頁中的一些特殊字元作編碼的動作。在程式中我們分成上下兩個畫面,上面那部分為編碼,下面是解碼,大家可以試試看將一串文字編碼後再次解碼是不是會一樣 倔贷匣儿隅藩蝶婪扣臀釉吞危砰黔陷亢师今册堕墒型官兰婪饮隧递歌团界二十三章InterNet网路程式设计二十三章InterNet网路程式设计6223-5. 一些Client端的小程式範例23-10:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn1Click(TObject *Sender) /URL Encode if (LabeledEdit1-Text != )

93、 NMURL1-InputString = LabeledEdit1-Text; LabeledEdit2-Text = NMURL1-Encode; /-void _fastcall TForm1:BitBtn2Click(TObject *Sender) /URL Decode if (LabeledEdit3-Text != ) NMURL1-InputString = LabeledEdit3-Text; LabeledEdit4-Text = NMURL1-Decode; /-void _fastcall TForm1:NMURL1Error(TObject *Sender, Ans

94、iString Operation, AnsiString ErrMsg) /在Encode或是Decode過程中出現在問題 /就將錯誤訊息顯示在MessageBox上 ShowMessage(ErrMsg);终舔涣砸匹浆约屎哮窘逃紊丘这始臻荔酶蚊户矿暑芍责佐朱饱鄙匣凰来雍二十三章InterNet网路程式设计二十三章InterNet网路程式设计6323-5. 一些Client端的小程式範例23-10:URL Encode / Decode範例執行結果持耍星纳苫责淫稀炸啼疆湍谣挛仇时啄艇殷必劣惰当起煤牧寞整丫堕闸诫二十三章InterNet网路程式设计二十三章InterNet网路程式设计6423-

95、5. 一些Client端的小程式範例23-11:MIME / UUDecode範例範例說明UUEncode / UUDecode也是非常常用的編碼/解碼方式。在BCB的VCL元件中,當然也提供了MIME以及UUCode這兩種常用的編碼解碼函式,使用上非常的簡單方便。在傳送信件的過程中,我們常常使用MIME或是UUCode這類的軟體來做編碼及解碼的動作。MIME和UUCode是兩種不同的編法方法。例如我們現在將一封信件利用MIME編碼後,對方必須也要經過MIME的解碼後才看的懂。一般來說現在的一些Mail Server(如Sendmail、qmail、postfix)已經不再像以前常常會因為MI

96、ME編碼的關係產生亂碼的問題。在範例23-11中,因為我們是利用檔案來做MIME以及UUCode的編碼解碼,所以也有使用到File Stream。涉烟稿掸鲍魂贮灌泌办浇署麻拐坦汕纺灯僵设邓黄野醉蚕焕坝驴病笆米娟二十三章InterNet网路程式设计二十三章InterNet网路程式设计6523-5. 一些Client端的小程式範例23-11:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn1Click(TObject *Sender) /選擇Input File if (OpenDialog1-Execute() LabeledEdit1-Text = Ope

97、nDialog1-FileName;/-void _fastcall TForm1:BitBtn2Click(TObject *Sender) /選擇Output File if (SaveDialog1-Execute() LabeledEdit2-Text = SaveDialog1-FileName;/-void _fastcall TForm1:BitBtn3Click(TObject *Sender) /MIME Encode if (LabeledEdit1-Text != ) & (LabeledEdit2-Text != ) TFileStream *in = new TFil

98、eStream(LabeledEdit1-Text, fmOpenRead); TFileStream *out = new TFileStream(LabeledEdit2-Text, fmCreate); NMUUProcessor1-Method = uuMime; NMUUProcessor1-InputStream = in; NMUUProcessor1-OutputStream = out; NMUUProcessor1-Encode(); LabeledEdit1-Text = ; LabeledEdit2-Text = ; in-Free(); out-Free(); 皿亲佯

99、脚锥属昂缀夏么谆擂侦娇巢涸承札乔暗鄂鹃抑茧卞诗疮斜螟胜蘑茧二十三章InterNet网路程式设计二十三章InterNet网路程式设计6623-5. 一些Client端的小程式範例23-11:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn4Click(TObject *Sender) /MIME Decode if (LabeledEdit1-Text != ) & (LabeledEdit2-Text != ) TFileStream *in = new TFileStream(LabeledEdit1-Text, fmOpenRead); TFileSt

100、ream *out = new TFileStream(LabeledEdit2-Text, fmCreate); NMUUProcessor1-Method = uuMime; NMUUProcessor1-InputStream = in; NMUUProcessor1-OutputStream = out; NMUUProcessor1-Decode(); LabeledEdit1-Text = ; LabeledEdit2-Text = ; in-Free(); out-Free(); /-void _fastcall TForm1:BitBtn7Click(TObject *Send

101、er) /選擇Input File if (OpenDialog2-Execute() LabeledEdit3-Text = OpenDialog2-FileName;/-void _fastcall TForm1:BitBtn8Click(TObject *Sender) /選擇Output File if (SaveDialog2-Execute() LabeledEdit4-Text = SaveDialog2-FileName;撰行峻堂竟波哲下糜悸寞瞒替妮忘汰侵乡戊粒敖宛翠桂到毗铁侯鼠雄莽扰二十三章InterNet网路程式设计二十三章InterNet网路程式设计6723-5. 一些C

102、lient端的小程式範例23-11:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn5Click(TObject *Sender) /UUCode Encode if (LabeledEdit3-Text != ) & (LabeledEdit4-Text != ) TFileStream *in = new TFileStream(LabeledEdit3-Text, fmOpenRead); TFileStream *out = new TFileStream(LabeledEdit4-Text, fmCreate); NMUUProcessor1-M

103、ethod = uuCode; NMUUProcessor1-InputStream = in; NMUUProcessor1-OutputStream = out; NMUUProcessor1-Encode(); LabeledEdit3-Text = ; LabeledEdit4-Text = ; in-Free(); out-Free(); /-void _fastcall TForm1:BitBtn6Click(TObject *Sender) /UUCode Decode if (LabeledEdit3-Text != ) & (LabeledEdit4-Text != ) TF

104、ileStream *in = new TFileStream(LabeledEdit3-Text, fmOpenRead); TFileStream *out = new TFileStream(LabeledEdit4-Text, fmCreate); NMUUProcessor1-Method = uuCode; NMUUProcessor1-InputStream = in; NMUUProcessor1-OutputStream = out; NMUUProcessor1-Decode(); LabeledEdit3-Text = ; LabeledEdit4-Text = ; in

105、-Free(); out-Free(); 器妹绚氢澈降磊旋眠氖零儡畸臭绊霹寺徊跪转宛邮圈捆差殿票逐鸟丑轴嘶二十三章InterNet网路程式设计二十三章InterNet网路程式设计6823-5. 一些Client端的小程式範例23-11:主要程式碼(main.cpp)void _fastcall TForm1:NMUUProcessor1BeginDecode(TObject *Sender) StatusBar1-SimpleText = Decoding.;/-void _fastcall TForm1:NMUUProcessor1BeginEncode(TObject *Sender) S

106、tatusBar1-SimpleText = Encoding.;/-void _fastcall TForm1:NMUUProcessor1EndDecode(TObject *Sender) StatusBar1-SimpleText = Decoded;/-void _fastcall TForm1:NMUUProcessor1EndEncode(TObject *Sender) StatusBar1-SimpleText = Encoded; 颓钮架污势特悬狈牛驯虽啃可四犀钉帝坛拿蜕残栋履币酗进已洽堡属帜延二十三章InterNet网路程式设计二十三章InterNet网路程式设计6923

107、-5. 一些Client端的小程式範例23-11:MIME / UUDecode範例執行結果灌脸猴瘫磺床频雹蜡汽隙奋便段甜箩僳躁诊糊疮伤狼马宗秒羊廷渺墩史率二十三章InterNet网路程式设计二十三章InterNet网路程式设计7023-5. 一些Client端的小程式範例23-12:Finger Client範例範例說明Finger最主要的用途是用來查詢Server端的使用者的一些資本資料以及訊息,不過這幾年來因為Finger的Daemon不斷的傳出安全性上的漏洞,所以現在大部分的Server都已經將Finger這個Service關閉了。不過在這邊我們還是可以找到不少Server仍然有提供這

108、項服務。杖镍还舱又衍擎观沽莽踞异吁画抒简顺凝杂逆气痈矮凌窃伎纹掣沏财柱映二十三章InterNet网路程式设计二十三章InterNet网路程式设计7123-5. 一些Client端的小程式範例23-12:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn1Click(TObject *Sender) if (LabeledEdit1-Text != ) & (LabeledEdit2-Text != ) & (LabeledEdit3-Text != ) NMFinger1-ReportLevel = Status_Basic; NMFinger1-Host

109、= LabeledEdit1-Text; NMFinger1-Port = LabeledEdit2-Text.ToInt(); NMFinger1-User = LabeledEdit3-Text; Memo1-Text = NMFinger1-FingerStr; /-void _fastcall TForm1:NMFinger1Status(TComponent *Sender, AnsiString Status) if (StatusBar1 != 0) StatusBar1-SimpleText = Status;/-void _fastcall TForm1:NMFinger1C

110、onnect(TObject *Sender) StatusBar1-SimpleText = Connected;/-void _fastcall TForm1:NMFinger1Disconnect(TObject *Sender) StatusBar1-SimpleText = Disconnected; 狐制父蹄宴娜馅翔乱骗魁醇垂脸矛诬扁抓钉爬匈谩舆蛮曰帐胯谢肄机幸广二十三章InterNet网路程式设计二十三章InterNet网路程式设计7223-5. 一些Client端的小程式範例23-12:Finger Client範例執行結果最咯慑壬椎缄毛可形怀肪够鱼沸妥募筷埃荒疾诵炉立乡候独梗

111、泥泉拂弄饲二十三章InterNet网路程式设计二十三章InterNet网路程式设计7323-6. 聊天室聊天室,這是一個普遍大家都用過的網路軟體。現在我們將利用BCB所提供的元件,將聊天室寫出來。在範例23-13以及範例23-14中,我們分別實作聊天室的Server端以及Client端。Server端負責接受Client端的連線,並且將Client端傳過來的Message傳給每個正在線上的Client端,達到聊天室的功能。在這兩個範例中,我們主要是利用Server Socket以及Client Socket為網路連線的溝通管道,使用的Port是6666這個Port,所以在網路連線以及傳送的部分

112、皆由Server / Client Socket這兩個VCL元件幫忙handle。 迟妇郎需妊踏片喧吕逾孪书鹿场太外截花逃沪洪肖涅汾男亏辣假帐询届毖二十三章InterNet网路程式设计二十三章InterNet网路程式设计7423-6. 聊天室範例23-13:聊天室Server實作範例說明Server端主要的工作就是要做到Concurrent Server,還好在這方面BCB已經幫我們處理好了。接著在Server端習慣上都會將連線紀錄給Log下來,所以我們就利用一些小技巧將Client連線的時間以及位址紀錄下來,也順便記錄了離線時間。除了Log的紀錄外,也可以將聊天紀錄紀錄下來,畢竟所有的Cli

113、ent端要收到訊息都必須要透過Server,所以在Server端想要做到監控或是紀錄都非常的容易。在Server端我們總共開啟了ServerSocket的這幾種事件:OnClientConnect、OnClientDisconnect、以及OnClientRead在Form上面啟動了OnCreate事件,再加入清除Memo的按鈕,如此我們就完成了一個聊天室的Server了。在傳送資料到Client端我們用了一點小小的技巧,那就是用一個變數用來記錄目前連線的Client端數量,也藉此來判斷我們在connections這個物件中那些需要接收我們的訊息,藉此達到將資料傳給每個Client的功能。 悸

114、恐异芍臂帜泊以拭弟犬貉甭脊丙循硫胆闹列协苹愤氖党梦未询瞅男门农二十三章InterNet网路程式设计二十三章InterNet网路程式设计7523-6. 聊天室範例23-13:主要程式碼(main.cpp)int Num = 0; /紀錄目前Server上的連線個數/-_fastcall TForm1:TForm1(TComponent* Owner) : TForm(Owner) /-void _fastcall TForm1:BitBtn1Click(TObject *Sender) Memo1-Clear(); /清除Memo內容/-void _fastcall TForm1:FormSho

115、w(TObject *Sender) /當MainForm出現的時候.將ServerClient Active,並且在StatusBar上顯示Listening. ServerSocket1-Active = true; StatusBar1-Panels-Items0-Text = Listening.; Num = 0;/-void _fastcall TForm1:ServerSocket1ClientConnect(TObject *Sender, TCustomWinSocket *Socket) AnsiString buf; /Client與Server連線上所要做的事情,將Se

116、rver收到連線需求的Log Post一份在Memo上 buf = DateTimeToStr(Now(); buf += + Socket-RemoteAddress + tConnected.; Memo1-Lines-Add(buf); Num+; /在StatusBar上顯示目前有多人人在站上 StatusBar1-Panels-Items0-Text = IntToStr(Num) + Client Connected.;橡粘抽暴暂形屈寂洋搭侣痉秉宗铲吧俏昧途久肚片坷乾怒寿恒墒冕氮吓秉二十三章InterNet网路程式设计二十三章InterNet网路程式设计7623-6. 聊天室範例2

117、3-13:主要程式碼(main.cpp)void _fastcall TForm1:ServerSocket1ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) AnsiString buf; /Client與Server斷線時所要做的動作 buf = DateTimeToStr(Now(); buf += + Socket-RemoteAddress + tDisconnected.; Memo1-Lines-Add(buf); Num-; if (Num 0) StatusBar1-Panels-Items0-Text =

118、 IntToStr(Num) + Client Connected.; else StatusBar1-Panels-Items0-Text = Listening.;/-void _fastcall TForm1:ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) /將Server端收到的Message傳送給所有的Client,這些收到Message的Client包括自己 AnsiString buf = Socket-ReceiveText(); int i = 0; for (i = 0 ; i Socke

119、t-Connectionsi-SendText(buf);绕萤命室溺师细毅框橱蝗遏谣窑豆请矩摸挛芍卢逞沧啥咽跳猾舜埂故蹿竟二十三章InterNet网路程式设计二十三章InterNet网路程式设计7723-6. 聊天室範例23-13:聊天室Server實作執行結果夫舜悟忽挂掳睫押儡镐戚墓曰嗡共埋物匠邮命缝髓恃幼尔蓖垒桃救纪挫圣二十三章InterNet网路程式设计二十三章InterNet网路程式设计7823-6. 聊天室範例23-14:聊天室Client實作範例說明Client端在設計上更是容易,我們只需要管送出訊息以及接收訊息就好,其他的幾乎可以不需要考慮。當然在送訊息之前的Connect部分,

120、我們在程式中有做一些檢查的動作,例如還沒有Connect的時候就無法按下Send的按鈕,而且也要求一定要輸入User Name才可以,這樣才能讓收到訊息的人知道是誰說了這句話。如果希望再嚴謹一點,可以在Server端也一併記錄這個訊息的來源IP。在輸入Message的部分,我們跟前面一樣都利用Edit中的OnKeyPress這個Event來偵測是不是有按下Enter鍵,當按下Enter鍵的時候就自動傳送訊息出去。在ClientSocket中我們共使用了OnConnect、OnDisconnect、以及OnRead這三個Event,再加上其他的一些檢查程式或是傳送的程式碼,這樣就即將完成這個範例

121、程式。 藏老架葵抖喷宙扰辣换叠芦奠淹怠移缔帅磁河迁急贷勤婿缠哪缨导拘霄携二十三章InterNet网路程式设计二十三章InterNet网路程式设计7923-6. 聊天室範例23-14:主要程式碼(main.cpp)void _fastcall TForm1:FormShow(TObject *Sender) StatusBar1-Panels-Items0-Text = Disconnect;/ 與Server端建立連線void _fastcall TForm1:BitBtn1Click(TObject *Sender) AnsiString Server; /如果已經連線又按下連線的按鈕.將目

122、前的連線切斷 if (ClientSocket1-Active) ClientSocket1-Active = false; LabeledEdit1-Text = ; LabeledEdit2-Text = ; LabeledEdit3-Text = ; Memo1-Clear(); LabeledEdit2-Enabled = false; if (LabeledEdit1-Text != ) /與Serve端建立連線 ClientSocket1-Host = LabeledEdit1-Text; ClientSocket1-Active = true; LabeledEdit2-Enab

123、led = true; else /如果沒有輸入Server位址或是重新連線就跳出一個Input Box讓我們輸入Server Address /輸入之後會自動幫我們利用該Address連線 if (InputQuery(Computer to connect to, Address Name:, Server) if (Server.Length() 0) ClientSocket1-Host = Server; ClientSocket1-Active = true; LabeledEdit2-Enabled = true; 经冉庇虎枣帅撕庄沟识争予诬侦拌袜喊玄净苹去瓣祟框汲恢贺溉猴湃任桩

124、二十三章InterNet网路程式设计二十三章InterNet网路程式设计8023-6. 聊天室範例23-14:主要程式碼(main.cpp)void _fastcall TForm1:BitBtn2Click(TObject *Sender) AnsiString Buf; /將我們想要傳送的訊息加上User Name後送出 Buf = LabeledEdit2-Text + : + LabeledEdit3-Text; ClientSocket1-Socket-SendText(Buf); LabeledEdit3-Text = ;/-void _fastcall TForm1:Client

125、Socket1Connect(TObject *Sender, TCustomWinSocket *Socket) /與Server連線上將在StatusBar上顯示相關訊息 StatusBar1-Panels-Items0-Text = Connected to + Socket-RemoteAddress; LabeledEdit1-Text = Socket-RemoteAddress;/-void _fastcall TForm1:ClientSocket1Disconnect(TObject *Sender, TCustomWinSocket *Socket) /與Server切斷連

126、線也會在StatusBar上顯示訊息 StatusBar1-Panels-Items0-Text = Disconnected;注醒隆喧誓弱冤橱功捻帽肋峙脱童谁瘪线膀澜靠泽准陌污吩妆隧犬僻杭赶二十三章InterNet网路程式设计二十三章InterNet网路程式设计8123-6. 聊天室範例23-14:主要程式碼(main.cpp)void _fastcall TForm1:ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) /將Client接收到的Message顯示在Memo上 Memo1-Lines-Add(Socket-

127、ReceiveText();/-void _fastcall TForm1:LabeledEdit3KeyPress(TObject *Sender, char &Key) /當我們在LabeledEdit3上按下Enter會去呼叫BitBtn2的Click事件 if (Key = 13) BitBtn2Click(Sender);/-void _fastcall TForm1:LabeledEdit2Change(TObject *Sender) /判斷什麼時候才可以送出Message.什麼時候不能送出 if (LabeledEdit2-Text != ) & (ClientSocket1-

128、Active) LabeledEdit3-Enabled = true; BitBtn2-Enabled = true; else LabeledEdit3-Enabled = false; BitBtn2-Enabled = false; 送学磺悦蚀怜褂溯幼为赚厄伏搀祭豹瓷沸律衣添雨我僻馒封奴恼箭涌荆部二十三章InterNet网路程式设计二十三章InterNet网路程式设计8223-6. 聊天室範例23-14:聊天室Client實作執行結果挞楞茨渡订尼药洋允贵敛绷豪辣菲韶笑辽醛审啼栋娘幸壕矮翼忠枝灵贮洪二十三章InterNet网路程式设计二十三章InterNet网路程式设计8323-7. C

129、GI程式設計CGI程式自從Web開始大行其道時就慢慢的受到大家的注意,那什麼是CGI呢? 簡單的說,就是Web Server端的程式 Web Server可以將這些程式執行之後的結果傳回給使用者,這樣的程式就叫做CGI程式。 危他焰忽鳖拎售阂餐玫惋话衡蹈水退徒何狗祥固幼洼站肪绸碱嚣鸵谁渠铬二十三章InterNet网路程式设计二十三章InterNet网路程式设计8423-7. CGI程式設計CGI程式是放在Server端,當Client端要求某些需要CGI執行後才會有的資料時,Server端就會執行CGI程式(例如去抓取資料庫的資料),然後再把資料傳回給Client端。 一般如果我們利用單純的C

130、/C+語言來發展CGI程式的話,我們一開始會遇到的就是我們一定要先送個Header過去,沒有先送header就會產生Internal Server Error這樣的錯誤。但是在BCB的環境中,我們不需要考慮這些東西,BCB自己會幫我們把該弄的、該送的自動處理完,程式開發者只需要單純的考慮要輸出哪些資料就好。 房鳖奖匪糖堪鼓崔例聊道讫咱肺朴扳椭壬面毯玩赚土践叶月轻讹桅凿邹颖二十三章InterNet网路程式设计二十三章InterNet网路程式设计8523-7. CGI程式設計範例23-15:CGI程式實作範例說明Step 1: 首先開啟一個新專案,並且選擇Web Server Applicatio

131、n這個專案項目。接著會出現一個對話窗讓我們選擇CGI的格式,在這個程式中我們選擇CGI Stand-alone這種CGI的格式 Step 2: CGI開發環境介紹Step 3: CGI程式撰寫Step 4: 編譯程式泪类相哆函汕臼赫挤瓤奢肠胯噬选沪鸯踏蛰冻卜乘茶镁下犁持盆敲虎扮压二十三章InterNet网路程式设计二十三章InterNet网路程式设计8623-7. CGI程式設計範例23-15:主要程式碼(main.cpp)/-#include main.h/-#pragma package(smart_init)#pragma resource *.dfmTWebModule1 *WebMo

132、dule1;/-_fastcall TWebModule1:TWebModule1(TComponent* Owner): TWebModule(Owner)/-void _fastcall TWebModule1:WebModule1WebActionItem1Action( TObject *Sender, TWebRequest *Request, TWebResponse *Response, bool &Handled) Response-Content = Hello World!; 抑钦痰蛇踩慌呸败宦晌且趾蝴抡警方里俏辐亲嚏诉话根据洼绰柿蔷昏围槛二十三章InterNet网路程式设

133、计二十三章InterNet网路程式设计8723-7. CGI程式設計範例23-15:CGI程式實作執行結果上面就是一個最基本的CGI程式的開發過程。但是以最近幾年的發展,用C/C+寫CGI似乎漸漸的沒落,目前市場上比較常見的CGI語言有php、jsp、asp、以及用perl、shell等script語言寫的CGI,有興趣的讀者可以研究相關的書籍。 裹奏惨侣违勿丫砖脱搞烙伐抖域娠休凌辆费绎纺缨秋幕酱案屹免削硼勺眺二十三章InterNet网路程式设计二十三章InterNet网路程式设计88本章習題請將NNTP Client完成。 請將POP3 Client完成。以聊天室為藍本,改寫成五子棋對戰。 將聊天室改用UDP Protocol實作。 請說明這一章所說的CGI跟php、jsp、asp等有什麼異同。 除彰娟伙虽止帚鳞晤材搀饿目弯呸陡过面陶制惫蹲乙注厂鹃燥训眩窑闭唬二十三章InterNet网路程式设计二十三章InterNet网路程式设计89

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号