web服務(wù)器設(shè)計畢業(yè)論文_第1頁
已閱讀1頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  第一章 概述</b></p><p>  如今,上網(wǎng)已成為最熱門話題,通過Internet,我們既能獲取信息又能發(fā)布信息,而迅速發(fā)展的Web技術(shù)更是給Internet應(yīng)用提供了一個很好的發(fā)展方向。當今的許多應(yīng)用都是基于web技術(shù)的,如電子商務(wù)、視頻會議、遠程醫(yī)療診斷等。由于HTMI 語言的標準統(tǒng)一性,只要在設(shè)備里建立一個微型web服務(wù)器,人們就可以使用現(xiàn)有的W

2、eb瀏覽器與該設(shè)備進行雙向交互、接收或發(fā)送信息。因此,針對微型web服務(wù)器的研究和應(yīng)用,具有重大的意義,它為我們管理、控制和監(jiān)測各種各樣的設(shè)備提供了一個很好的途徑一基于Internet,也就是說,只要設(shè)備接入了Internet,我們就可以在世界上的任何地方十分方便地控制、操縱那些配備有微型Web服務(wù)器的設(shè)備。 </p><p>  1.1 課題意義、目的</p><p>  WWW 是

3、World Wide Web (環(huán)球信息網(wǎng))的縮寫,也可以簡稱為 Web,中文名字為“萬維網(wǎng)”。它起源于1989年3月,由歐洲量子物理實驗室 CERN(the European Laboratory for Particle Physics)所發(fā)展出來的主從結(jié)構(gòu)分布式超媒體系統(tǒng)。通過萬維網(wǎng),人們只要通過使用簡單的方法,就可以很迅速方便地取得豐富的信息資料。 由于用戶在通過 Web 瀏覽器訪問信息資源的過程中,無需再關(guān)心一些技術(shù)性的細節(jié),

4、界面簡單容易操作。長期以來,人們只是通過傳統(tǒng)的媒體(如電視、報紙、雜志和廣播等)獲得信息,但隨著計算機網(wǎng)絡(luò)的發(fā)展,人們想要獲取信息,已不再滿足于傳統(tǒng)媒體那種單方面?zhèn)鬏敽瞳@取的方式,而希望有一種主觀的選擇性?,F(xiàn)在,網(wǎng)絡(luò)上提供各種類別的數(shù)據(jù)庫系統(tǒng),如文獻期刊、產(chǎn)業(yè)信息、氣象信息、論文檢索等等。由于計算機網(wǎng)絡(luò)的發(fā)展,信息的獲取變得非常及時、迅速和便捷。 </p><p>  到了1993年,WWW 的技術(shù)有了突破性的進

5、展,它解決了遠程信息服務(wù)中的文字顯示、數(shù)據(jù)連接以及圖像傳遞的問題,使得 WWW 成為 Internet 上最為流行的信息傳播方式。 現(xiàn)在,Web 服務(wù)器成為 Internet 上最大的計算機群,可以說,Web 為 Internet 的普及邁出了開創(chuàng)性的一步, WWW 采用的是客戶/服務(wù)器結(jié)構(gòu),其作用是整理和儲存各種WWW資源,并響應(yīng)客戶端軟件的請求,把客戶所需的資源傳送到Windows NT、UNIX 或 Linux 等平臺上。<

6、/p><p>  國際計算機互聯(lián)網(wǎng)也稱因特網(wǎng)(Internet),已有20多年的發(fā)展歷史,它的前身是美國國防計算機互聯(lián)網(wǎng)(ARPA),現(xiàn)已發(fā)展為一個全球性的計算機互聯(lián)網(wǎng)絡(luò)。該網(wǎng)是世界上信息資源最豐富的計算機網(wǎng)絡(luò),被人們公認為是未來國際信息高速公路的雛形。 因特網(wǎng)上具有上萬個技術(shù)資料數(shù)據(jù)庫,其信息媒體包括數(shù)據(jù)、圖象、文字、聲音等多種形式;信息屬性有數(shù)據(jù)、交換軟件、圖書、檔案等門類;信息內(nèi)容涉及通信、計算機、農(nóng)業(yè)、生物、

7、天文、醫(yī)學、政治、法律、軍事、音樂等各個方面。 可以看出萬維網(wǎng)是Internet的一部份 實際上,WWW( World Wide Web ) 是一種建立在Internet上的全球性的、交互的、動態(tài)、多平臺、分布式、圖形信息系統(tǒng)。它只是建立在Internet上的一種網(wǎng)絡(luò)服務(wù)。它的開發(fā)最初是為了在科學家之間共享成果, 科學家們可以將科研成果以圖文形式方在網(wǎng)上進行共享。它的最基本的概念就是Hypertext(超文本),如果你用過W

8、indows上的任何一種在線幫助系統(tǒng)你就會比較了解它的結(jié)構(gòu)了。 現(xiàn)在,WWW的應(yīng)用已遠遠超出了原設(shè)想,成為Internet 上最受歡迎的應(yīng)用之一。它的出現(xiàn)極大</p><p>  下圖顯示了星型和拓撲的網(wǎng)絡(luò)連接:</p><p>  本次設(shè)計就是需要完成一個簡易的WEB服務(wù)器的設(shè)計,實現(xiàn)web服務(wù)器基本功能: 頁面訪問請求響應(yīng)、HTML文件的解析以及數(shù)據(jù)發(fā)送。所以在完成設(shè)計之前,

9、必須先了解WEB服務(wù)器設(shè)計的原理與結(jié)構(gòu)</p><p>  1.2 WEB服務(wù)器現(xiàn)況</p><p>  目前在市場上有20到30種Web應(yīng)用服務(wù)器,每種服務(wù)器在實現(xiàn)對象組件支持、 分布式計算、部署的速度和易用程度上采取了不同方式。       目前市場上主流Web服務(wù)器主要有以下幾種產(chǎn)品:</p><p

10、>  1.Apache,由SUN公司開發(fā)的Apache服務(wù)器可以運行在包括Linux等多種系統(tǒng)平臺之上。Apache支持許多特性,大部分通過編譯的模塊實現(xiàn),如很有用的URL重寫,定制日志文件以及過濾支持等。</p><p>  2.Zeus Webserver3.3.8 服務(wù)器,Zeus服務(wù)器在SMP (Symmetric Multi Processing的簡稱,意為對稱多處理系統(tǒng),內(nèi)有許多緊耦合多處理器,

11、這種系統(tǒng)的最大特點就是共享所有資源) 環(huán)境下有優(yōu)秀的可伸縮性,并實現(xiàn)了常見的特性集合,如訪問控制、動態(tài)內(nèi)容產(chǎn)生和安全等。</p><p>  3. iPlanet Enterprise Edition 4.1,Netscape公司開發(fā)的iPlanet具有現(xiàn)今高性能WEB服務(wù)器的特性,如具有很高的可靠性、可用性、可維護性,系統(tǒng)高度可擴展性等特點,相對其它WEB服務(wù)器iPlanet還提供更多的JAVA功能。</

12、p><p>  4.AOLserver 3.3.1 ,AOL公司開發(fā)的AOLserver 3.3.1是一個多線程、可升級和擴展的WEB服務(wù)器。</p><p>  5. Roxen WebServer 2.1.31,在Roxen中可以使用RXML語言生成動態(tài)網(wǎng)頁內(nèi)容。RXML是函數(shù)形式的服務(wù)器端XML腳本語言,它由Roxen服務(wù)器解析并執(zhí)行。</p><p>  6.

13、Jigsaw,它由WWW組織(W3C)開發(fā),W3C組織負責研究和規(guī)定網(wǎng)絡(luò)協(xié)議的標準(如HTTP)。它使用JAVA語言開發(fā),是成功的面向?qū)ο蟆⒐δ苋娴姆?wù)器。因為Jigsaw不受測試平臺的限制,所以Jigsaw是一個具有活力的、擁有無限潛能的優(yōu)秀WEB服務(wù)器。</p><p>  在嵌入式系統(tǒng)的應(yīng)用中,由于HTMI 語言的標準統(tǒng)一性,只要在設(shè)備里建立一個微型web服務(wù)器,人們就可以使用現(xiàn)有的Web瀏覽器與該設(shè)備進

14、行雙向交互、接收或發(fā)送信息。它為我們管理、控制和監(jiān)測各種各樣的設(shè)備提供了一個很好的途徑,只要設(shè)備接入了Internet,我們就可以在世界上的任何地方十分方便地控制、操縱那些配備有微型Web服務(wù)器的設(shè)備。</p><p>  在Internet上為了發(fā)布信息,用戶必須運行Web服務(wù)器程序。但現(xiàn)成的服務(wù)器程序有時候不能滿足所有人的要求,所以可以動手開發(fā)一個自己的Web服務(wù)器程序,其功能就可由設(shè)計者定制的功能和需求決定

15、了。</p><p>  1. 3 解決方案和所做主要工作</p><p>  本次設(shè)計就是需要完成一個簡易的WEB服務(wù)器的設(shè)計,實現(xiàn)web服務(wù)器基本功能: 頁面訪問請求響應(yīng)、HTML文件的解析以及數(shù)據(jù)發(fā)送。所以在完成設(shè)計之前,必須先了解WEB服務(wù)器設(shè)計的原理與結(jié)構(gòu)。</p><p>  一般來說,Web服務(wù)器通常由以下幾個部分組成:(1)服務(wù)器初始化

16、部分.這部分主要完成Web服務(wù)器的初始化工作,如建立守護進程、創(chuàng)建TCP套接字、綁定端口、將TCP套接字轉(zhuǎn)換成偵聽套接字,進入循環(huán)結(jié)構(gòu),等待接收用戶瀏覽器連接.(2)接收客戶端請求.由于客戶端請求以文本行的方式實現(xiàn),所以服務(wù)器一般也以文本行為單位接收.(3)解析客戶端請求.這部分工作比較復雜,需要解析出請求的方法、URL目標、可選的查詢信息及表單信息.如果請求方法為HEAD,則簡單地返回響應(yīng)首部即可;如果方法是GET,則首先返回響應(yīng)首部

17、,然后將客戶端請求的URL目標文件從服務(wù)器磁盤上讀出,再發(fā)送給客戶端。 (4)發(fā)送響應(yīng)信息之后,關(guān)閉與客戶機的連接.</p><p>  在了解WEB服務(wù)器的基本結(jié)構(gòu)后,就需要更進一步了解如何實現(xiàn)服務(wù)器與協(xié)議的連接,那就需要用到CSOCK,這也是本次設(shè)計中的核心與重點。通過SOCKET,利用VC++編程就能基本實現(xiàn)了簡易的WEB服務(wù)器的設(shè)計,并能在window系統(tǒng)下運行良好的運行,實現(xiàn)web服務(wù)器基本功能:頁面訪

18、問請求響應(yīng)、HTML文件的解析以及數(shù)據(jù)發(fā)送。</p><p>  第二章 WEB服務(wù)體系結(jié)構(gòu)</p><p>  2.1 WEB服務(wù)器基本構(gòu)架</p><p>  Web應(yīng)用的基本構(gòu)架包括瀏覽器、網(wǎng)絡(luò)和Web服務(wù)器。瀏覽器向服務(wù)器請求Web頁,Web頁可能包括由瀏覽器解釋執(zhí)行的客戶端腳本,而且可以與瀏覽器、頁內(nèi)容和頁中包含的其他控件(Java Applet

19、、ActiveX控件和插件等)進行交互。用戶向Web頁輸入信息或通過超級鏈接導航到其它Web頁,與系統(tǒng)進行交互,改變系統(tǒng)的“業(yè)務(wù)狀態(tài)”。</p><p>  2.1.1 WEB服務(wù)器和瀏覽器</p><p>  WEB 是基于請求和響應(yīng)的系統(tǒng),它是在C/S(Client/Server)結(jié)構(gòu)的基礎(chǔ)上發(fā)展而來的。為了實現(xiàn)世界范圍內(nèi)的信息共享和發(fā)布,它規(guī)范了通訊協(xié)議,并規(guī)范、強化Client/S

20、erver兩端的系統(tǒng)功能,WEB為用戶在Internet上查看文檔提供了一個圖形化的,易于進入的界面,WEB是一種基于超文本傳輸協(xié)議(Hypertext Transport Potocol 簡稱HTTP)向計算機傳送多媒體信息(如文本、圖片、聲音、視頻、交互式應(yīng)用程序)的Internet服務(wù)。同C/S結(jié)構(gòu)一樣,WEB由兩部分構(gòu)成,即WEB服務(wù)器端和WEB瀏覽器端,WEB服務(wù)器的主要功能是:創(chuàng)建、管理和維護WEB頁面,對瀏覽器的請求進行應(yīng)

21、答并返回HTML頁,WEB瀏覽器(Browser)用來觀看WEB資源的客戶端軟件,主要負責請求,解釋并顯示W(wǎng)EB頁,其工作過程見圖2.1。</p><p>  Web瀏覽器通常可以使用流行的IE或者其它的瀏覽器。服務(wù)器端的TCP/IP協(xié)議是操作系統(tǒng)內(nèi)嵌的,其信息流符合HTTP協(xié)議。服務(wù)器中的HTTP引擎用來分析瀏覽器的請求消息,并根據(jù)請求做出相應(yīng)的動作。這些動作包括向瀏覽器發(fā)送一些靜態(tài)頁面或調(diào)用一些應(yīng)用服務(wù)程序。

22、對于服務(wù)器中的靜態(tài)web頁面,可以使用一些常用軟件如FrontPage等制作,以備Web服務(wù)器調(diào)用。而服務(wù)器中的應(yīng)用服務(wù)程序則用來擴展服務(wù)器所提供的服務(wù)。從圖l中可以看出,微型web服務(wù)器的核心就是:HTTP引擎。</p><p>  HTTP協(xié)議是一種網(wǎng)絡(luò)應(yīng)用層的標準協(xié)議,Web瀏覽器和Web服務(wù)器之間的通信都是采用HTTP協(xié)議來實現(xiàn)的。因此只要是符合HTTP協(xié)議的通訊過程和數(shù)據(jù)內(nèi)容,就可以使用瀏覽器作為客戶端

23、進行連接和傳遞。</p><p>  圖2.1 Web工作原理</p><p>  圖2.1 主要過程為:</p><p>  WEB瀏覽器通過將URL發(fā)給WEB服務(wù)器請求信息;</p><p>  WEB服務(wù)器響應(yīng)請求,并返回給客戶機超文本標記語言(HTML)頁面;</p><p>  WEB瀏覽器對超文本標記語言(

24、HTML)頁面進行解釋并顯示。</p><p>  2.1.2 WEB頁面</p><p>  WEB頁面是WEB系統(tǒng)實現(xiàn)發(fā)布、進行管理的主要對象。WEB頁面像一個大的容器,將要發(fā)布的文字、圖片、聲音、動畫、視頻等多種媒體信息封裝到一起,供WEB系統(tǒng)實現(xiàn)發(fā)布,進行管理。對于WEB系統(tǒng)而言,在眾多的WEB頁面中,有一個稱為WEB主頁的頁面,它是訪問者瀏覽WEB系統(tǒng)的起點。每個WEB頁面都

25、具有唯一的地址,稱為統(tǒng)一資源定位符(URL),URL由存儲此頁面的計算機名和此頁面的確切路徑構(gòu)成。</p><p>  WEB頁面是超文本標記語言(HTML)編寫的。HTML是一種嵌入式語言,通過在普通文本中嵌入各種標記(TAG),使普通文本具有了超級文本的功能。根據(jù)WEB頁面的內(nèi)容,可將WEB頁面分為三種類型:靜態(tài)頁面,動態(tài)頁面,目錄列表頁面。</p><p>  2.2 WEB系統(tǒng)的

26、基本原理是請求/響應(yīng)</p><p>  客戶端,瀏覽器接受用戶輸入的網(wǎng)頁地址(URL)并進行分析,從而得到網(wǎng)頁的文件名字和存放網(wǎng)頁的計算機地址以及服務(wù)程序的端口號,首先根據(jù)計算機地址及端口號與服務(wù)器建立連接,然后把網(wǎng)頁名稱及瀏覽器本身的有關(guān)信息按照一定的格式組織起來,發(fā)給服務(wù)器,這就是‘請求’。比如用戶輸入http://kulin.ts/index.html,從而可知:</p><p>

27、  計算機名稱為kulin.ts根據(jù)這個名字能獲知其計算機地址</p><p>  端口號為80(http服務(wù)的默認端口號)</p><p>  頁面的文件名為index.html</p><p>  瀏覽器就與kulin上端口號為80的服務(wù)程序建立連接,并把類似下面的數(shù)</p><p>  據(jù)發(fā)過(作為服務(wù)‘請求’):</p>

28、<p>  GET /index.htm HTTP/1.1</p><p>  Accept:image/gif,image/x-xbitmap,application/vnd.ms-powerpoint,*/*</p><p>  Accept-Language:ch</p><p>  UA-pixels:800*600</p><

29、;p>  UA-color:color16</p><p>  UA-OS:Windows xp</p><p>  UA-CPU:P41.6</p><p>  User-Agent:Mozilla/2.0(compatible’MSIE3.01;Window XP</p><p>  Host:kulin.ts</p>

30、<p>  Connection:Keep-Alive</p><p>  其中第一行說明了文件名稱(index.html)、請求的類型(GET)及瀏覽器支持的協(xié)議版本(HTTP/1.0)</p><p>  服務(wù)器端接受到請求后,對其進行分析,解析出網(wǎng)頁的文件名稱及其他信息(比如請求的類型、處理要求等),根據(jù)網(wǎng)頁的文件名稱到磁盤上提取文件內(nèi)容,把文件內(nèi)容和一些必要的說明信息打

31、包后發(fā)給瀏覽器,然后斷開連接,這就是“響應(yīng)”。(瀏覽器接到文件內(nèi)容后就將其中的內(nèi)容顯示出來了)比如對于文件長度為2559B的index.html來說,可以發(fā)送如下數(shù)據(jù)作為“響應(yīng)”:</p><p>  HTTP/1.1 200 OK</p><p>  Server: kulin.ts-HttpSvr/1.1</p><p>  Date:WED,20 may 20

32、06 12:45:21 </p><p>  Content-type:text/html</p><p>  Content-length:2559</p><p>  Last-Modified:Sun,22 may 2006 14:21:50</p><p>  <接下來是index.htm的文件內(nèi)容></p>

33、<p>  上述數(shù)據(jù)分2大部分,第1部分為“頭”,其中,第1行是狀態(tài)行,包括服務(wù)器執(zhí)行的HTTP版本及本次響應(yīng)的狀態(tài)碼。后4行分別說明了服務(wù)器名稱、當前日期、數(shù)據(jù)類型、數(shù)據(jù)長度、最后修改的日期和時間。第2部分為數(shù)據(jù)“體”,是“請求”要求傳送的數(shù)據(jù),它跟在1個空行之后。</p><p>  當然,客戶端和服務(wù)器之間還可能有一些中間環(huán)節(jié),比如代理服務(wù)器、網(wǎng)關(guān)、“隧道”等,在此我們先不予考慮。</p&

34、gt;<p>  2.3 WEB服務(wù)器/瀏覽器的通信</p><p>  要完成Web服務(wù),除了網(wǎng)絡(luò)通信鏈路的建立和拆除,之外至少還要有二方面的功能:“分折請求” 和“構(gòu)造響應(yīng)”??蛻舳伺c服務(wù)器交換數(shù)據(jù)之前,首先用TCP/IP建立連接,客戶端向服務(wù)器請求數(shù)據(jù),服務(wù)器則向客戶端響應(yīng)并提供數(shù)據(jù).客戶端和服務(wù)器以HTTP協(xié)議進行請求和響應(yīng).服務(wù)器和客戶端只能為一次事務(wù)處理建立并維持連接,完成一次事務(wù)處理

35、后便結(jié)束連接.</p><p>  每一個客戶端向服務(wù)器發(fā)送請求均以方法(Method)開始,后跟對象的URL.客戶端一般要在上述信息中補充所采用HTTP協(xié)議的版本號,其后跟一個回車換行(CRLF)字符對.依據(jù)請求情況,瀏覽器可能在CRLF后加上瀏覽器按特別的首部格式編碼的信息.完成后,瀏覽器給請求加上一個CRLF.還可依據(jù)請求情況,把一個實體(MIME格式文檔)加到整個請求之后.一個HTTP方法實際上是一條命令

36、,客戶端用它來說明其請求目的,常用的有GET,HEAD和POST.</p><p>  Web服務(wù)器收到請求并解析之后,以一個HTTP響應(yīng)消息響應(yīng)客戶端的請求.這個響應(yīng)消息通常以HTTP協(xié)議版本號開始,后面是三位狀態(tài)碼和一個原因短語(Reason phrase),其后是一個CRLF,再后是請求的信息(它被服務(wù)器以一種特殊的首部格式編碼),最后,服務(wù)器加上一個CRLF.其后還可以有一個可選實體.狀態(tài)碼是三位數(shù),它描

37、述了服務(wù)器理解和滿足請求的情況,原因短語是狀態(tài)代碼的一個簡短說明.HTTP協(xié)議版本號、狀態(tài)代碼、原因短語一起構(gòu)成了狀態(tài)行.</p><p>  上述分析不難看出,接收客戶端請求、解析客戶端請求、響應(yīng)客戶端請求、向客戶端回送請求的結(jié)果是Web服務(wù)器所需完成的主要任務(wù),Web服務(wù)器程序代碼主要是為了完成這幾項任務(wù).</p><p>  2.3.1 分析請求</p><p&

38、gt;  如前文所述,“請求”的第1行數(shù)據(jù)是最重要的,它的格式是:</p><p>  方法 資源地址 HTTP版本號 回車換行</p><p>  “方法”主要有3種:</p><p>  GET:要求必須返回一定的內(nèi)容。有時還必須根據(jù)“請求”的要求先對內(nèi)容做一定的處理(比如解壓縮或根據(jù)時間進行過濾)。</p><p>  HEA

39、D:處理辦法和GET完全相同,但要求只返回“頭”,而不可返回任何實質(zhì)內(nèi)容(“體”)。</p><p>  POST:用來處理網(wǎng)頁的附屬內(nèi)容,比如“注解”、數(shù)據(jù)回送等。</p><p>  作為簡單的服務(wù)器,我們只考慮第一行,且只處理GET請求,版本號不予理睬。</p><p><b>  2.3.2構(gòu)造響應(yīng)</b></p><

40、;p>  如前文所述,響應(yīng)的第1行是狀態(tài)行,非常重要,格式如下:</p><p>  HTTP 版本號 狀態(tài)碼 狀態(tài)文字說明 回車換行</p><p>  版本號可取HTTP/1.1;狀態(tài)碼是3位數(shù)字,根據(jù)情況按表2.1所示代碼取值。 </p><p>  表2.1 狀態(tài)碼值 </p><p>  作為簡易的服務(wù)器,“響應(yīng)”可

41、以只返回狀態(tài)行和文件內(nèi)容,即送回如下的內(nèi)容:</p><p>  HTTP/1.1 200 OK 狀態(tài)行</p><p><b>  一個空行</b></p><p>  文件內(nèi)容 文件內(nèi)容</p><p>  2.4 Winsock技術(shù)簡介</p><p>  套接

42、字是網(wǎng)絡(luò)通信的基本構(gòu)件,提供了不同主機間進程雙向通 信的端點,如同電話,只有當一方撥通另一方時,雙方方能建立對話,而套接字正好比雙方的電話。通過Sockets 編程,程序可以跳過復雜的網(wǎng)絡(luò)底層協(xié)議和結(jié)構(gòu),直接編制與平臺無關(guān)的應(yīng)用程序。隨著Internet 的廣泛應(yīng)用,Sockets 已逐漸成為網(wǎng)絡(luò)編程的通用接口。</p><p>  因為Windows Sockets 主要是面向C/S 體系結(jié)構(gòu)的,即客戶向服務(wù)器

43、發(fā)出請求,服務(wù)器只有在接收到請求后才能提供相應(yīng)服務(wù)。雙方在建立對話前, 服務(wù)進程和接受服務(wù)的進程( 客戶)必須首先建立起各自用于網(wǎng)間進程通信的半相關(guān),即一個三元組( 協(xié)議,本地地址,本地端口),但只有雙方獨立的半相關(guān)還不能建立起溝通。一個完整的網(wǎng)絡(luò)通信進程必須通過由兩個獨立進程組成的一個完整的全相關(guān)唯一確定方能得已實現(xiàn),而且,只有兩個性質(zhì)相同的半相關(guān)才能建立一個完整的全相關(guān)五元組— —(協(xié)議,本地地址,本地端口,遠地地址,遠地端口),由

44、此方能建立起一個網(wǎng)間進程通信的實例。</p><p>  2.4.1 什么是Windows Sockets規(guī)范?</p><p>  Windows Sockets規(guī)范是一套開放的、支持多種協(xié)議的Windows下的網(wǎng)絡(luò)編程接口。從1991年的1.0版到1995年的2.0.8版,經(jīng)過不斷完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,

45、已成為Windows網(wǎng)絡(luò)編程上的標準。</p><p>  Windows Sockets規(guī)范是建立在Bekeley套接口模型上的。這個模型現(xiàn)在已是TCP/IP網(wǎng)絡(luò)的標準。Windows Sockets規(guī)范是以U.C. Berkeley 大學UNIX中流行的Socket接口為范例而設(shè)定的一套Windows網(wǎng)絡(luò)接口編程。這個規(guī)范不僅包含了我們所熟悉的Berkeley Socket套接口風格的庫函數(shù),也包含了針對Wi

46、ndows的擴展庫函數(shù),這樣一來使程序員能充分利用Windows消息驅(qū)動機制進行相應(yīng)的編程。</p><p>  應(yīng)用程序調(diào)用Windows Sockets的API實現(xiàn)相互之間的通訊。Windows Sockets又利用下層的網(wǎng)絡(luò)通訊協(xié)議功能和操作系統(tǒng)調(diào)用實現(xiàn)實際的通訊工作。它們之間的關(guān)系如圖2.2。</p><p>  圖2.2 應(yīng)用程序與sockets的關(guān)系</p>&l

47、t;p>  2.4.2 Windows Sockets規(guī)范發(fā)展歷程</p><p>  indows Sockets規(guī)范發(fā)展至今已經(jīng)經(jīng)歷了三個階段,首先是Windows Sockets1.0的發(fā)布,Windows Sockets 1.0代表了網(wǎng)絡(luò)軟件供應(yīng)商和用戶協(xié)會細致周到的工作的結(jié)晶。Windows Sockets 1.0規(guī)范的發(fā)布是為了讓網(wǎng)絡(luò)軟件供應(yīng)商和應(yīng)用程序開發(fā)者能夠開始建立各自的符合Windows

48、 Sockets標準的實現(xiàn)和應(yīng)用程序。</p><p>  為了更能滿足個系統(tǒng)的要求,有發(fā)布了之后的1.1版本W(wǎng)indows Sockets 1.1繼承了Windows Sockets 1.0的準則和結(jié)構(gòu),并且僅在一些絕對必要的地方作了改動。這些改動都是基于不少公司在創(chuàng)作Windows Sockets 1.0實現(xiàn)時的經(jīng)驗和教訓的。Windows Sockets 1.1包含了一些更加清晰的說明和對Windows S

49、ockets 1.0的小改動。還有很多的改動就不做一一介紹了。</p><p>  現(xiàn)在大多的網(wǎng)絡(luò)編程的規(guī)范已經(jīng)是Windows Socket 2,它在1.1上又有了更多的改動,具體的改動在這里也不做具體的介紹了。</p><p><b>  2.4.3 套接口</b></p><p>  套接口是從英文單詞socket翻譯過來的,它是網(wǎng)絡(luò)通信

50、的基本構(gòu)件。套接口是可以被命名和尋址的通信端點,使用中的每一個套接字都有它的類型和一個與之相連的進程。</p><p>  套接口存在于通信區(qū)域中。通信區(qū)域也叫地址族,它是一個抽象的概念,主要用于將通過套接口通信的進程的共有特性綜合在一起。套接口通常和同一個域中的套接口交換數(shù)據(jù)(數(shù)據(jù)交換也可能穿越域的界限,但這時一定要執(zhí)行某種解釋程序)。Windows Sockets規(guī)范支持單一的通訊域,即Internet域。各

51、種進程使用這個域互相之間用Internet協(xié)議族來進行通訊(Windows Sockets 1.1以上的版本支持其他的域,例如Windows Sockets 2)。</p><p>  套接口可以根據(jù)通訊性質(zhì)分類;這種性質(zhì)對于用戶是可見的。應(yīng)用程序一般僅在同一類的套接口間通訊。不過只要底層的通訊協(xié)議允許,不同類型的套接口間也照樣可以通訊。用戶目前可以使用兩種套接口,即流套接口和數(shù)據(jù)報套接口。流套接口提供了雙向的,

52、有序的,無重復并且無記錄邊界的數(shù)據(jù)流服務(wù)。數(shù)據(jù)報套接口支持雙向的數(shù)據(jù)流,但并不保證是可靠,有序,無重復的。也就是說,一個從數(shù)據(jù)報套接口接收信息的進程有可能發(fā)現(xiàn)信息重復了,或者和發(fā)出時的順序不同。數(shù)據(jù)報套接口的一個重要特點是它保留了記錄邊界。對于這一特點,數(shù)據(jù)報套接口采用了與現(xiàn)在許多包交換網(wǎng)絡(luò)(例如以太網(wǎng))非常類似的模型。</p><p>  2.5 VisualC++6.0簡介</p><p

53、>  Visual C++是運行于Windows平臺上的交互式的可視化集成開發(fā)環(huán)境,它是美國Microsoft公司開發(fā)的Microsoft Visual Studio套件的一部分。跟其他的可視化集成開發(fā)環(huán)境(如Visual Basic、Delphi、C++ Builder)一樣,Visual C++ 6.0集程序的代碼編輯、編譯、連接和調(diào)試等功能于一體,給編程人員提供了一個完整方便的開發(fā)界面和許多有效的輔助開發(fā)工具。Visual

54、C++ 6.0的應(yīng)用程序向?qū)Э梢詾楹艽笠徊糠诸愋偷某绦蛱峁┛蚣艽a,用戶不用書寫程序代碼,只需按幾個按鈕就可以生成一些完整的可以運行的程序。</p><p>  第三章 系統(tǒng)設(shè)計</p><p><b>  3.1 界面設(shè)計</b></p><p>  正如包裝那樣,一個優(yōu)秀的軟件除了方便實用的功能外,其界面的優(yōu)秀設(shè)計也是必不可少的,因為

55、良好的界面形象一來能夠體現(xiàn)公司的形象和實力;二來能夠使用戶操作更為方便,具有說明性的圖表按鈕也能夠為用戶帶來使用的方便;三來能夠體現(xiàn)其軟件的良好特性和功能。</p><p>  目前軟件界面的發(fā)展潮流為圖形說明化和具體化,以前簡單和粗糙的簡單設(shè)計已經(jīng)逐漸被淘汰,典型的如WindowsXP,其界面和Windows2000就有明顯的差別,圖形化的成分更多了,細致到每一個圖表都有其特定的功能含義。</p>

56、<p>  本次設(shè)計的WEB服務(wù)器端的程序軟件,雖然小,但也要盡量按照軟件界面設(shè)計的發(fā)展趨勢來完成,首先要方便簡潔,另用戶能很容易的上手操作,其次要盡量體現(xiàn)軟件的良好特性和功能。</p><p>  3.1.1界面設(shè)計要求</p><p>  對于應(yīng)用軟件來說,一個基本現(xiàn)實就是:用戶界面是面向用戶的。用戶需要的是開發(fā)者開發(fā)的應(yīng)用軟件滿足其需求,并且易于使用。界面設(shè)計的重要性有這

57、么幾個原因:首先,用戶界面越直觀,就越易用,越易用就越便宜。因為界面越好,培訓用戶就越容易,降低了培訓成本;界面越出色,用戶就越少求助,降低了客戶支持成本。其次,界面越出色,用戶就喜歡使用,增強了開發(fā)者工作的滿意度。 </p><p>  3.1.2界面制作方法</p><p>  該WEB服務(wù)器是通過C++編程來實現(xiàn)的。首先新建一個MFC Appwizard(exe)工程,然后建立一個

58、對話框。接著在對話框里面添加按鈕,列表框以及靜態(tài)文本框,改變各控件的名稱,調(diào)整對話框及各控件的大小,使界面美觀大方。</p><p>  3.2 偵聽模塊設(shè)計</p><p>  偵聽模塊是HTTP服務(wù)器很重要的模塊之一,它包括了服務(wù)器端的操作套接字,幫定端口,監(jiān)聽客戶端請求幾個部分,是服務(wù)器運行的關(guān)鍵部分。它的流程圖如下:</p><p><b>  

59、請求</b></p><p><b>  偵聽模塊流程圖</b></p><p>  3.2.1服務(wù)器端操作Socket(套接字)</p><p> ?。ㄒ唬┰诔跏蓟A段調(diào)用WSAStartup()</p><p>  此函數(shù)在應(yīng)用程序中初始化Windows Sockets DLL,只有此函數(shù)調(diào)用成功后,應(yīng)用

60、程序才可以再調(diào)用其他Windows Sockets DLL中的API函數(shù)。在程序中調(diào)用該函數(shù)的形式如下:WSAStartup((WORD)((1<<8|1),(LPWSADATA)&WSAData),其中(1<<8|1)表示我們用的是WinSocket1.1版本,WSAata用來存儲系統(tǒng)傳回的關(guān)于WinSocket的資料。</p><p> ?。ǘ┙ocket</p&g

61、t;<p>  初始化WinSock的動態(tài)連接庫后,需要在服務(wù)器端建立一個監(jiān)聽的Socket,為此可以調(diào)用Socket()函數(shù)用來建立這個監(jiān)聽的Socket,并定義此Socket所使用的通信協(xié)議。此函數(shù)調(diào)用成功返回Socket對象,失敗則返回INVALID_SOCKET(調(diào)用WSAGetLastError()可得知原因,所有WinSocket 的函數(shù)</p><p>  都可以使用這個函數(shù)

62、來獲取失敗的原因)。 SOCKET PASCAL FAR socket( int af, int type, int protocol ) 參數(shù): af:目前只提供 PF_INET(AF_INET); type:Socket 的類型 (SOCK_STREAM、SOCK_DGR

63、AM); protocol:通訊協(xié)定(如果使用者不指定則設(shè)為0); 如果要建立的是遵從TCP/IP協(xié)議的socket,第二個參數(shù)type應(yīng)為SOCK_STREAM,如為UDP(數(shù)據(jù)報)的socket,應(yīng)為SOCK_DGRAM。</p><p><b>  (三)綁定端口</b></p><p>  接下來要為服務(wù)器端定義的這個監(jiān)聽的Socket指定一個

64、地址及端口(Port),這樣客戶端才知道待會要連接哪一個地址的哪個端口,為此我們要調(diào)用bind()函數(shù),該函數(shù)調(diào)用成功返回0,否則返回SOCKET_ERROR。</p><p>  int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR *name,int&

65、#160;namelen );</p><p>  參 數(shù):s:Socket對象名;</p><p>  name:Socket的地址值,這個地址必須是執(zhí)行這個程式所在機器的IP地址;</p><p>  namelen:name的長度;</p><p>  如果使用者不在意地址或端口的值,那么可以設(shè)定地址為INADDR_

66、ANY,及Port為0,Windows Sockets 會自動將其設(shè)定適當之地址及Port (1024 到 5000之間的值)。此后可以調(diào)用getsockname()函數(shù)來獲知其被設(shè)定的值。</p><p><b> ?。ㄋ模┍O(jiān)聽</b></p><p>  當服務(wù)器端的Socket對象綁定完成之后,服務(wù)器端必須建立一

67、個監(jiān)聽的隊列來接收客戶端的連接請求。listen()函數(shù)使服務(wù)器端的Socket 進入監(jiān)聽狀態(tài),并設(shè)定可以建立的最大連接數(shù)(目前最大值限制為 5, 最小值為1)。該函數(shù)調(diào)用成功返回0,否則返回SOCKET_ERROR。</p><p>  int PASCAL FAR listen( SOCKET s, int b

68、acklog );</p><p>  參 數(shù): s:需要建立監(jiān)聽的Socket;</p><p>  backlog:最大連接個數(shù); </p><p>  服務(wù)器端的Socket調(diào)用完listen()后,如果此時客戶端調(diào)用connect()函數(shù)提出連接申請的話,Server 端必須再調(diào)用accept() 

69、函數(shù),這樣服務(wù)器端和客戶端才算正式完成通信程序的連接動作。為了知道什么時候客戶端提出連接要求,從而服務(wù)器端的Socket在恰當?shù)臅r候調(diào)用accept()函數(shù)完成連接的建立,我們就要使用WSAAsyncSelect()函數(shù),讓系統(tǒng)主動來通知有客戶端提出連接請求了。該函數(shù)調(diào)用成功返回0,否則返回SOCKET_ERROR。</p><p>  int PASCAL FAR WSAAsync

70、Select( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent );</p><p>  參數(shù): s:Socket 對象;</p><p>  hWnd :接收消息的窗口句柄;</p><p>

71、  wMsg:傳給窗口的消息;</p><p>  lEvent:被注冊的網(wǎng)絡(luò)事件,也即是應(yīng)用程序向窗口發(fā)送消息的網(wǎng)路事件,該值為下列值FD_READ、FD_WRITE、FD_OOB、FD_ACCEPT、FD_CONNECT、FD_CLOSE的組合,各個值的具體含意為FD_READ:希望在套接字S收到數(shù)據(jù)時收到消息;FD_WRITE:希望在套接字S上可以發(fā)送數(shù)據(jù)時收到消息;FD_ACCEPT:希望在套接字S上收到

72、連接請求時收到消息;FD_CONNECT:希望在套接字S上連接成功時收到消息;FD_CLOSE:希望在套接字S上連接關(guān)閉時收到消息;FD_OOB:希望在套接字S上收到帶外數(shù)據(jù)時收到消息。</p><p>  具體應(yīng)用時,wMsg應(yīng)是在應(yīng)用程序中定義的消息名稱,而消息結(jié)構(gòu)中的lParam則為以上各種網(wǎng)絡(luò)事件名稱。所以,可以在窗口處理自定義消息函數(shù)中使用以下結(jié)構(gòu)來響應(yīng)Socket的不同事件:  </p>

73、<p>  switch(lParam) </p><p><b>  {</b></p><p>  case FD_READ:</p><p><b>  …  </b></p><p><b>  break;</b></p><

74、p>  case FD_WRITE、</p><p><b>  …</b></p><p><b>  break;</b></p><p><b>  …</b></p><p><b>  }  </b></

75、p><p>  (五) 服務(wù)器端接受客戶端的連接請求</p><p>  當Client提出連接請求時,Server 端hwnd視窗會收到Winsock Stack送來我們自定義的一個消息,這時,我們可以分析lParam,然后調(diào)用相關(guān)的函數(shù)來處理此事件。為了使服務(wù)器端接受客戶端的連接請求,就要使用accept() 函數(shù),該函數(shù)新建一Socket與客戶端的Socke

76、t相通,原先監(jiān)聽之Socket繼續(xù)進入監(jiān)聽狀態(tài),等待他人的連接要求。該函數(shù)調(diào)用成功返回一個新產(chǎn)生的Socket對象,否則返回INVALID_SOCKET。</p><p>  (六)結(jié)束 socket 連接</p><p>  結(jié)束服務(wù)器和客戶端的通信連接是很簡單的,這一過程可以由服務(wù)器或客戶機的任一端啟動,只要調(diào)用closesocket()就可以了,而要關(guān)閉Serve

77、r端監(jiān)聽狀態(tài)的socket,同樣也是利用此函數(shù)。另外,與程序啟動時調(diào)用WSAStartup()憨數(shù)相對應(yīng),程式結(jié)束前,需要調(diào)用 WSACleanup() 來通知Winsock Stack釋放Socket所占用的資源。這兩個函數(shù)都是調(diào)用成功返回0,否則返回SOCKET_ERROR。</p><p>  3.3 應(yīng)答模塊設(shè)計</p><p>  用戶通過瀏覽器輸

78、入網(wǎng)頁地址(URL)來訪問服務(wù)器,而服務(wù)器就要求對其發(fā)送的請求進行相應(yīng)的分析,分析客戶端的地址,端口,以及請求瀏覽的文件。所以本人所設(shè)計的主干程序為服務(wù)器工作線程函數(shù)Serverthread,它主要用于接受客戶請求的時候,利用多線程來進行處理。其他的函數(shù)還有瀏覽器請求函數(shù),顯示信息函數(shù),錯誤信息函數(shù),及事件處理函數(shù)等。最后實現(xiàn)的HTTP服務(wù)器具有一般HTTP服務(wù)器最基本的功能,可以發(fā)布用HTML語言編寫的網(wǎng)頁,用戶可以在已經(jīng)建立了連接的

79、若干個網(wǎng)頁之間切換瀏覽。</p><p>  客戶端 服務(wù)器端</p><p><b>  SYN</b></p><p><b>  SYN ACK</b></p><p><b>  ACK </b></p><

80、p><b>  三次握手原理圖</b></p><p>  3.3.1服務(wù)器工作線程函數(shù)Serverthread</p><p>  首先我們介紹服務(wù)器工作線程函數(shù)Serverthread的基本流程圖4.1(見下頁)。</p><p>  圖3.1服務(wù)器工作線程函數(shù)Serverthread流程圖</p><p> 

81、 圖中很清晰的描述了服務(wù)器工作線程函數(shù)Serverthread的流程,此設(shè)計為簡易的WEB服務(wù)器所以只對HTML請求的第一行就行分析,對于剩下部分不做分析,還有該HTTP服務(wù)器還不能對CGI請求做出響應(yīng),也不能調(diào)用相應(yīng)的ISAPI的DLL(動態(tài)連接庫)。只能發(fā)送最基本的靜態(tài)文本。</p><p>  3.4 系統(tǒng)托盤程序</p><p>  自從微軟公司推出Windows 95操作系統(tǒng)以

82、來,系統(tǒng)托盤應(yīng)用作為一種極具吸引力的用戶界面設(shè)計深受廣大用戶的喜愛。使用系統(tǒng)托盤作為用戶界面的Windows應(yīng)用程序數(shù)不勝數(shù),比如"金山詞霸"、"Winamp"、"RealPlayer"等等。</p><p>  本次WEB服務(wù)器的軟件設(shè)計為了用戶使用方便,使軟件界面更隨意和簡潔,我們也將引入系統(tǒng)托盤程序。</p><p>  系

83、統(tǒng)托盤程序運行時不顯示運行窗口,只在任務(wù)欄上顯示一個圖標,表示程序正在運行,用戶可以通過鼠標與應(yīng)用程序交互,程序開發(fā)人員有時也需要編制一些僅在后臺運行的類似程序,為了不干擾前臺程序的運行界面和不顯示不必要的窗口,應(yīng)使程序運行時的主窗口不可見。同時將一個圖標顯示在任務(wù)欄右端靜態(tài)通告區(qū)中并響應(yīng)用戶的鼠標動作。該程序編譯運行后,如果雙擊托盤圖標,程序會彈出一個消息列表窗口,只要鼠標在托盤圖標上移動或點擊(無論是左右鍵的單擊或雙擊),產(chǎn)生的消息

84、都會顯示在這個窗口里;當鼠標光標移到托盤圖標上時,在圖標附近會顯示提示信息;單擊右鍵時彈出上下文菜單,這個菜單中應(yīng)包含打開屬性頁的命令或者打開與圖標相關(guān)的其它窗口的命令,另外,該程序還可以動態(tài)的改變托盤的圖標。</p><p>  3.4.1 系統(tǒng)托盤程序?qū)崿F(xiàn)方法</p><p>  為了實現(xiàn)拖盤程序,首先要使程序的主窗口不可見,這點實現(xiàn)起來十分容易,只要調(diào)用ShowWindow(SW_

85、HIDE)就可以了,本實例采用的就是這種方法,還有一種思路是通過分別設(shè)置主邊框窗口的風格和擴展風格來隱藏主框架: </p><p>  BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) </p><p><b>  { </b></p><p>  cs.style =WS_POPUP

86、;//使主窗口不可見; </p><p>  cs.dwExStyle =WS_EX_TOOLWINDOW;//不顯示任務(wù)按鈕; </p><p>  return CFrameWnd::PreCreateWindow(cs); </p><p><b>  } </b></p><p>  在任務(wù)條上顯示圖標是利用系統(tǒng)

87、API函數(shù)Shell_NotifyIcon()來將一個圖標顯示在任務(wù)欄的通告區(qū)中。該函數(shù)的原型為: </p><p>  BOOL Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA pnid); </p><p>  該函數(shù)的第一個參數(shù)dwMessage類型為DWORD,表示要進行的動作,它可以是下面的值之一: </p>&l

88、t;p>  NIM_ADD: 添加一個圖標到任務(wù)欄。 </p><p>  NIM_MODIFY: 修改狀態(tài)欄區(qū)域的圖標。 </p><p>  NIM_DELETE: 刪除狀態(tài)欄區(qū)域的圖標。 </p><p>  NIM_SETFOCUS: 將焦點返回到任務(wù)欄通知區(qū)域。當完成用戶界面操作時,任務(wù)欄圖標必須用此消息。例如,如果任務(wù)欄圖標正顯示上下文菜單,但用戶

89、按下"ESCAPE"鍵取消操作,這時就必須用此消息將焦點返回到任務(wù)欄通知區(qū)域。 </p><p>  NIM_SETVERSION:指示任務(wù)欄按照相應(yīng)的動態(tài)庫版本工作。 </p><p>  第二個參數(shù)pnid是NOTIFYICONDATA結(jié)構(gòu)的地址,其內(nèi)容視dwMessage的值而定。這個結(jié)構(gòu)在SHELLAPI.H文件中定義如下: </p><p&

90、gt;  typedef struct _NOTIFYICONDATA { </p><p>  DWORD cbSize; // 結(jié)構(gòu)大?。╯izeof struct),必須設(shè)置 </p><p>  HWND hWnd; // 發(fā)送通知消息的窗口句柄 </p><p>  UINT uID; // 圖標ID ( 由回調(diào)函數(shù)的WPARAM 指定) </p&g

91、t;<p>  UINT uFlags; </p><p>  UINT uCallbackMessage; // 消息被發(fā)送到此窗口過程 </p><p>  HICON hIcon; // 任務(wù)欄圖標句柄 </p><p>  CHAR szTip[64]; // 提示文本 </p><p>  } NOTIFYICONDA

92、TA; </p><p>  這樣,在WEB服務(wù)器源程序里,添加用戶自定義消息以及消息函數(shù),托盤程序就實現(xiàn)了。</p><p>  3.4.2 托盤程序的實際運行</p><p>  通過上述方法,我們設(shè)計所需要的托盤基本功能就能實現(xiàn)了,即在系統(tǒng)選項中設(shè)置后臺運行項目,在用戶單擊后,WEB服務(wù)器界面將被一個小圖標代替,隱藏至Windows右下角的任務(wù)欄,在用戶需要

93、關(guān)掉服務(wù)器軟件的運行時,則只需要左鍵單擊任務(wù)欄服務(wù)器圖標即可關(guān)掉運行中的軟件。</p><p>  實際操作中,在向WEB服務(wù)器源程序中添加用戶自定義消息、消息函數(shù)以及托盤程序后,運行的結(jié)果是在用戶單擊后臺運行選項后,服務(wù)器運行界面被一個小圖標代替,隱藏至Windows右下角的任務(wù)欄,但是在鼠標左鍵單擊任務(wù)欄服務(wù)器圖標時候,卻無法響應(yīng),而導致服務(wù)器軟件無法正常關(guān)閉。</p><p>  首

94、先,我認識到,實際的托盤程序即服務(wù)器運行界面被一個小圖標代替,并隱藏至Windows右下角的任務(wù)欄的程序并沒有錯,很有可能是自定義消息或者是自定義函數(shù)出了問題,于是,我又開始排查自定義消息以及函數(shù)的問題,經(jīng)過反復驗證與檢查,并沒有發(fā)現(xiàn)自定義消息或者是自定義函數(shù)出現(xiàn)問題。我又開始尋找響應(yīng)鼠標單擊消息的問題,可是也沒有查出問題,最終系統(tǒng)托盤程序還是沒有實現(xiàn)鼠標的響應(yīng),但我仍然在努力尋找出現(xiàn)的問題與解決方法。</p><p

95、><b>  第四章 系統(tǒng)實現(xiàn)</b></p><p>  4.1 服務(wù)器運行結(jié)果</p><p>  在完成各個模塊的構(gòu)建之后,就基本完成和實現(xiàn)了這個WEB服務(wù)器的功能,首先我們運行VC++最后編譯出的可執(zhí)行文件,運行服務(wù)器,并開始開啟WEB服務(wù)器功能,如圖4.1所示:</p><p>  圖4.1 開啟WEB服務(wù)器功能</p&

96、gt;<p>  這樣HTTP服務(wù)器開始工作了,在左下腳的狀態(tài)提示框里顯示開始偵聽連接。</p><p>  服務(wù)器運行之后,我們可以通過各種選項來改變服務(wù)器的設(shè)置,達到不同要求的需要,如圖4.2:</p><p>  圖4.2 服務(wù)器選項設(shè)置</p><p>  在普通一欄中可以通過可選項來改變服務(wù)器設(shè)置,使服務(wù)器是否記錄訪問記錄以及在主頁面是否顯示

97、根目錄下的文件夾列表。如圖4.3所示:</p><p>  如圖4.3 服務(wù)器可變選項</p><p>  在根目錄一欄我們可以自己設(shè)置服務(wù)器的根目錄存放地址與文件夾名稱,里面存放的是用戶的訪問的資源。如圖4.4所示:</p><p>  圖4.4服務(wù)器根目錄選項</p><p>  在服務(wù)器名稱這一欄中,我們可以選用默認服務(wù)器名稱(即服務(wù)器

98、運行的計算機名稱),也可按照要求或者需要改變服務(wù)器的名稱,同時,我們也可以設(shè)置端口號來改變監(jiān)聽的端口。如圖4.5所示:</p><p>  圖4.4服務(wù)器名稱以及端口號的改變</p><p>  之后我們在瀏覽器的地址欄中輸入我們所架設(shè)的服務(wù)器的地址,即http://531ok(http://后接的是運行WEB服務(wù)器軟件的計算機明名),別的聯(lián)網(wǎng)用戶也可以通過輸入正確的地址來請求訪問資源。用

99、戶發(fā)送的請求發(fā)送給服務(wù)器,服務(wù)器就會記錄下訪問者的地址,時間以及請求的信息,這些信息都會顯示在LISTBOX中,具體信息如圖4.3所示。</p><p>  圖4.2記錄請求信息</p><p>  服務(wù)器會記錄下了訪問者的信息,在用戶輸入地址后,后首先見到設(shè)計者的主業(yè)面,顯示了在根目錄下可供瀏覽的文件的名稱,大小,上次修改時間以及歡迎信息等,具體信息如圖4.4所示:</p>

100、<p>  圖4.3主頁面具體信息</p><p>  4.2 編譯程序時的問題以及解決方法</p><p>  1.編譯可以通過而不能鏈接</p><p>  在編譯成功后卻出現(xiàn)不能鏈接的狀況,屏幕顯示:</p><p>  Linking... LINK : fatal error LNK1104: cannot o

101、pen file "D:\98DDK\lib\i386\free\hid.lib" Error executing link.exe.</p><p>  最后經(jīng)過上網(wǎng)查找資料,找到了解決方法:打開VC,Tools--Options--Directories,在show directories for組合框中選擇library files,看看你的lib的路徑設(shè)置的對不對。如果不到,

102、雙擊其中的一項,將該路徑修改到你的指定目錄中即可。這樣就解決了上述問題。</p><p>  2.制作系統(tǒng)托盤程序圖標 </p><p>  在vc++編程中,在資源內(nèi)插入icon,即我們要制作的系統(tǒng)托盤程序圖標:</p><p>  (1)用vc++中的CimageList class 的 BOOL Create(int cx,int cy,BOOL bMask

103、,int nInitial,int nGrow); 初始化。 (2)用Windows的API函數(shù)LoadImage()裝載圖標資源; (3)用CImageList類的Add(HICON hIcon)函數(shù)加將裝載后的圖表添加到CImageList類對象中去; (4)調(diào)用CToolBarCtrl類的CImageList* SetImageList( CImageList* pImageList )函數(shù)將圖標列表對象與

104、工具條對象關(guān)聯(lián)起來,從而在工具條上顯示出裝載的圖標。</p><p>  這樣制作者就可以插入自己所需要的ICON,而可以不必使用系統(tǒng)自帶的圖標。</p><p><b>  3.制作自定義消息</b></p><p>  在制作自定義消息時必須要在CMainFrame類中添加自定義消息: #define WM_MY_TRAY_NOTIFIC

105、ATION WM_USER+0,這樣才能使自定義消息有效,之后必須手動添加消息映射,這樣才能使你的自定義消息有效,這兩點在實際編程中需要多注意,是很容易忽略的兩部分。</p><p>  4.3 程序運行調(diào)試結(jié)果</p><p>  在完成服務(wù)器軟件的編譯后,最后的工作就是調(diào)式系統(tǒng)和檢測軟件功能的實現(xiàn)。</p><p>  首先,編譯成功通過后,能正常運行軟件,服

106、務(wù)器各個選項的設(shè)置也能正常修改,并在服務(wù)器運行后,各個選項的修改能正確顯示出來。</p><p>  服務(wù)器運行后,能正常顯示用戶的訪問記錄,在主頁面上也能正確顯示服務(wù)器根目錄的所有文件,并提供用戶正常瀏覽和訪問。</p><p>  服務(wù)器運行后,可以實現(xiàn)局域網(wǎng)多用戶瀏覽,局域網(wǎng)的用戶可以通過輸出服務(wù)器運行計算機的名稱地址,就可訪問并瀏覽服務(wù)器內(nèi)容,由于客觀環(huán)境因素限制,我只測試了4個用

107、戶同時訪問成功。</p><p>  本次設(shè)計的WEB服務(wù)器基本功能已經(jīng)實現(xiàn),但只支持局域網(wǎng)內(nèi)的用訪問和瀏覽,對于外網(wǎng)的連接請求并不支持,如果需要支持外網(wǎng)用戶訪問,就需要修改程序中的網(wǎng)絡(luò)通信部分程序,即SOCKET部分程序,如果時間允許或者以后再有機會接觸或?qū)嶋H操作,我會爭取做好這部分。</p><p><b>  第五章 總結(jié)</b></p><

108、;p>  5.1 設(shè)計內(nèi)容總結(jié)</p><p>  本次設(shè)計就是完成一個簡易的WEB服務(wù)器的設(shè)計,實現(xiàn)web服務(wù)器基本功能:頁面訪問請求響應(yīng)、HTML文件的解析以及數(shù)據(jù)發(fā)送。</p><p>  本次設(shè)計的Web服務(wù)器,除了完成網(wǎng)絡(luò)通信鏈路的建立和拆除,之外至少還要有二方面的功能:“分折請求” 和“構(gòu)造響應(yīng)”??蛻舳伺c服務(wù)器交換數(shù)據(jù)之前,首先用TCP/IP建立連接,客戶端向服務(wù)器請

109、求數(shù)據(jù),服務(wù)器則向客戶端響應(yīng)并提供數(shù)據(jù)??蛻舳撕头?wù)器以HTTP協(xié)議進行請求和響應(yīng)。服務(wù)器和客戶端只能為一次事務(wù)處理建立并維持連接,完成一次事務(wù)處理后便結(jié)束連接。</p><p>  接收客戶端請求、解析客戶端請求、響應(yīng)客戶端請求、向客戶端回送請求的結(jié)果是Web服務(wù)器所需完成的主要任務(wù),Web服務(wù)器程序代碼主要是為了完成這幾項任務(wù).</p><p>  Web服務(wù)器通常由以下幾個部分組成,

110、也就是本次設(shè)計的主要內(nèi)容:(1)服務(wù)器初始化部分.這部分主要完成Web服務(wù)器的初始化工作,如建立守護進程、創(chuàng)建TCP套接字、綁定端口、將TCP套接字轉(zhuǎn)換成偵聽套接字,進入循環(huán)結(jié)構(gòu),等待接收用戶瀏覽器連接.(2)接收客戶端請求.由于客戶端請求以文本行的方式實現(xiàn),所以服務(wù)器一般也以文本行為單位接收.(3)解析客戶端請求.這部分工作比較復雜,需要解析出請求的方法、URL目標、可選的查詢信息及表單信息.如果請求方法為HEAD,則簡單地返回響應(yīng)首

溫馨提示

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

評論

0/150

提交評論