2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

18、問請(qǐng)求響應(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ù)器請(qǐng)求Web頁,Web頁可能包括由瀏覽器解釋執(zhí)行的客戶端腳本,而且可以與瀏覽器、頁內(nèi)容和頁中包含的其他控件(Java Applet

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

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

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

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

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

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

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

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

27、  計(jì)算機(jī)名稱為kulin.ts根據(jù)這個(gè)名字能獲知其計(jì)算機(jī)地址</p><p>  端口號(hào)為80(http服務(wù)的默認(rèn)端口號(hào))</p><p>  頁面的文件名為index.html</p><p>  瀏覽器就與kulin上端口號(hào)為80的服務(wù)程序建立連接,并把類似下面的數(shù)</p><p>  據(jù)發(fā)過(作為服務(wù)‘請(qǐng)求’):</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)、請(qǐng)求的類型(GET)及瀏覽器支持的協(xié)議版本(HTTP/1.0)</p><p>  服務(wù)器端接受到請(qǐng)求后,對(duì)其進(jìn)行分析,解析出網(wǎng)頁的文件名稱及其他信息(比如請(qǐng)求的類型、處理要求等),根據(jù)網(wǎng)頁的文件名稱到磁盤上提取文件內(nèi)容,把文件內(nèi)容和一些必要的說明信息打

31、包后發(fā)給瀏覽器,然后斷開連接,這就是“響應(yīng)”。(瀏覽器接到文件內(nèi)容后就將其中的內(nèi)容顯示出來了)比如對(duì)于文件長(zhǎng)度為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ù)器名稱、當(dāng)前日期、數(shù)據(jù)類型、數(shù)據(jù)長(zhǎng)度、最后修改的日期和時(shí)間。第2部分為數(shù)據(jù)“體”,是“請(qǐng)求”要求傳送的數(shù)據(jù),它跟在1個(gè)空行之后。</p><p>  當(dāng)然,客戶端和服務(wù)器之間還可能有一些中間環(huán)節(jié),比如代理服務(wù)器、網(wǎng)關(guān)、“隧道”等,在此我們先不予考慮。</p&

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

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

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

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

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

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

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

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

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

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

44、此方能建立起一個(gè)網(wǎng)間進(jìn)程通信的實(shí)例。</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ò)編程上的標(biāo)準(zhǔn)。</p><p>  Windows Sockets規(guī)范是建立在Bekeley套接口模型上的。這個(gè)模型現(xiàn)在已是TCP/IP網(wǎng)絡(luò)的標(biāo)準(zhǔn)。Windows Sockets規(guī)范是以U.C. Berkeley 大學(xué)UNIX中流行的Socket接口為范例而設(shè)定的一套Windows網(wǎng)絡(luò)接口編程。這個(gè)規(guī)范不僅包含了我們所熟悉的Berkeley Socket套接口風(fēng)格的庫函數(shù),也包含了針對(duì)Wi

46、ndows的擴(kuò)展庫函數(shù),這樣一來使程序員能充分利用Windows消息驅(qū)動(dòng)機(jī)制進(jìn)行相應(yīng)的編程。</p><p>  應(yīng)用程序調(diào)用Windows Sockets的API實(shí)現(xiàn)相互之間的通訊。Windows Sockets又利用下層的網(wǎng)絡(luò)通訊協(xié)議功能和操作系統(tǒng)調(diào)用實(shí)現(xiàn)實(shí)際的通訊工作。它們之間的關(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)歷了三個(gè)階段,首先是Windows Sockets1.0的發(fā)布,Windows Sockets 1.0代表了網(wǎng)絡(luò)軟件供應(yīng)商和用戶協(xié)會(huì)細(xì)致周到的工作的結(jié)晶。Windows Sockets 1.0規(guī)范的發(fā)布是為了讓網(wǎng)絡(luò)軟件供應(yīng)商和應(yīng)用程序開發(fā)者能夠開始建立各自的符合Windows

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

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

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

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

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

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

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

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

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

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

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

59、請(qǐng)求</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用來存儲(chǔ)系統(tǒng)傳回的關(guān)于WinSocket的資料。</p><p> ?。ǘ┙ocket</p&g

61、t;<p>  初始化WinSock的動(dòng)態(tài)連接庫后,需要在服務(wù)器端建立一個(gè)監(jiān)聽的Socket,為此可以調(diào)用Socket()函數(shù)用來建立這個(gè)監(jiān)聽的Socket,并定義此Socket所使用的通信協(xié)議。此函數(shù)調(diào)用成功返回Socket對(duì)象,失敗則返回INVALID_SOCKET(調(diào)用WSAGetLastError()可得知原因,所有WinSocket 的函數(shù)</p><p>  都可以使用這個(gè)函數(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,第二個(gè)參數(shù)type應(yīng)為SOCK_STREAM,如為UDP(數(shù)據(jù)報(bào))的socket,應(yīng)為SOCK_DGRAM。</p><p><b> ?。ㄈ┙壎ǘ丝?lt;/b></p><p>  接下來要為服務(wù)器端定義的這個(gè)監(jiān)聽的Socket指定一個(gè)

64、地址及端口(Port),這樣客戶端才知道待會(huì)要連接哪一個(gè)地址的哪個(gè)端口,為此我們要調(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對(duì)象名;</p><p>  name:Socket的地址值,這個(gè)地址必須是執(zhí)行這個(gè)程式所在機(jī)器的IP地址;</p><p>  namelen:name的長(zhǎng)度;</p><p>  如果使用者不在意地址或端口的值,那么可以設(shè)定地址為INADDR_

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

67、個(gè)監(jiān)聽的隊(duì)列來接收客戶端的連接請(qǐng)求。listen()函數(shù)使服務(wù)器端的Socket 進(jìn)入監(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:最大連接個(gè)數(shù); </p><p>  服務(wù)器端的Socket調(diào)用完listen()后,如果此時(shí)客戶端調(diào)用connect()函數(shù)提出連接申請(qǐng)的話,Server 端必須再調(diào)用accept() 

69、函數(shù),這樣服務(wù)器端和客戶端才算正式完成通信程序的連接動(dòng)作。為了知道什么時(shí)候客戶端提出連接要求,從而服務(wù)器端的Socket在恰當(dāng)?shù)臅r(shí)候調(diào)用accept()函數(shù)完成連接的建立,我們就要使用WSAAsyncSelect()函數(shù),讓系統(tǒng)主動(dòng)來通知有客戶端提出連接請(qǐ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 對(duì)象;</p><p>  hWnd :接收消息的窗口句柄;</p><p>

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

72、連接請(qǐng)求時(shí)收到消息;FD_CONNECT:希望在套接字S上連接成功時(shí)收到消息;FD_CLOSE:希望在套接字S上連接關(guān)閉時(shí)收到消息;FD_OOB:希望在套接字S上收到帶外數(shù)據(jù)時(shí)收到消息。</p><p>  具體應(yīng)用時(shí),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ù)器端接受客戶端的連接請(qǐng)求</p><p>  當(dāng)Client提出連接請(qǐng)求時(shí),Server 端hwnd視窗會(huì)收到Winsock Stack送來我們自定義的一個(gè)消息,這時(shí),我們可以分析lParam,然后調(diào)用相關(guān)的函數(shù)來處理此事件。為了使服務(wù)器端接受客戶端的連接請(qǐng)求,就要使用accept() 函數(shù),該函數(shù)新建一Socket與客戶端的Socke

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

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

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

79、若干個(gè)網(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è)計(jì)為簡(jiǎn)易的WEB服務(wù)器所以只對(duì)HTML請(qǐng)求的第一行就行分析,對(duì)于剩下部分不做分析,還有該HTTP服務(wù)器還不能對(duì)CGI請(qǐng)求做出響應(yīng),也不能調(diào)用相應(yīng)的ISAPI的DLL(動(dòng)態(tài)連接庫)。只能發(fā)送最基本的靜態(tài)文本。</p><p>  3.4 系統(tǒng)托盤程序</p><p>  自從微軟公司推出Windows 95操作系統(tǒng)以

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

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

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

85、HIDE)就可以了,本實(shí)例采用的就是這種方法,還有一種思路是通過分別設(shè)置主邊框窗口的風(fēng)格和擴(kuò)展風(fēng)格來隱藏主框架: </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ù)條上顯示圖標(biāo)是利用系統(tǒng)

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

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

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

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

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

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

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

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

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

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

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

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

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

100、<p>  圖4.3主頁面具體信息</p><p>  4.2 編譯程序時(shí)的問題以及解決方法</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è)置的對(duì)不對(duì)。如果不到,

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

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

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

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

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論