版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1基于Java的高效兼容HTTF服務(wù)器的研究及實(shí)現(xiàn)目錄摘要. 1一、引言. 4二、HTTP服務(wù)器模型 . 5(一) .、超文本傳輸協(xié)議 5(二) .、Java API中網(wǎng)絡(luò)類包簡(jiǎn)介6(三).、HTTP客戶機(jī)與服務(wù)器的交互涉及驟7(四).、HHTP 操作的一次事務(wù)(Transaction) 8(五).、HTTP消息 8三、HTTP服務(wù)器的兼容性 . 9四、Java實(shí)現(xiàn)多線程HTTP艮務(wù)器設(shè)計(jì) . 10(一).、Java語(yǔ)言網(wǎng)絡(luò)編程 10(二) .、服務(wù)器總體設(shè)計(jì) 121、總體設(shè)計(jì)的關(guān)鍵點(diǎn). 122、模塊設(shè)計(jì) . 123、HTTP服務(wù)器各類之間關(guān)系 . 14(三) .、服務(wù)器詳細(xì)設(shè)計(jì)分析 151、
2、線程重用 . 152、 .各類和接口的主要功能152(四).、Java多線程機(jī)制的應(yīng)用 17五、HTTP服務(wù)器運(yùn)行 . 23六、結(jié)束語(yǔ) . 24參考文獻(xiàn) . 25、引言SUN推出Java語(yǔ)言之后,全世界的目光都被這個(gè)神奇的語(yǔ)言所吸 引,Java語(yǔ)言從一開(kāi)始就內(nèi)置了支持網(wǎng)絡(luò)編程,因此更容易編寫(xiě)網(wǎng)絡(luò)應(yīng) 用程序;這也是與其他編程語(yǔ)言不同的地方。Java提供了大量類和接口可以處理各種網(wǎng)絡(luò)協(xié)議,共享信息,并行計(jì)算,應(yīng)用程序服務(wù)等優(yōu)秀特 點(diǎn)使java技術(shù)將會(huì)得到廣泛的應(yīng)用。Java是實(shí)現(xiàn)定制客戶機(jī)和服務(wù)器的 優(yōu)秀工具,因?yàn)樗С侄喾N在網(wǎng)絡(luò)上發(fā)送和接收數(shù)據(jù)、提供服務(wù)、接收 數(shù)據(jù)、調(diào)用服務(wù)的技術(shù)。Java作為
3、一種面向分布式計(jì)算機(jī)環(huán)境語(yǔ)言,提 供了完全意義的多線程支持,利用多線程編程接口,可以方便地寫(xiě)出支 持多線程的應(yīng)用程序,這一點(diǎn)也是 Java所特有的。隨著In ternet的普及 和Web技術(shù)的迅速發(fā)展,客戶/服務(wù)器結(jié)構(gòu)逐漸轉(zhuǎn)向?yàn)g覽器/服務(wù)器方向, Web文本發(fā)布具有簡(jiǎn)潔、生動(dòng)、形象等特點(diǎn),適用于發(fā)布信息,開(kāi)發(fā)基 于Browser/Server模式的Web數(shù)據(jù)庫(kù)信息檢索系統(tǒng)得到廣泛應(yīng)用。Web服務(wù)基于超文本傳輸協(xié)議(HTTP協(xié)議)。Java語(yǔ)言所具有的良好兼容性 、安全性、健壯性及可擴(kuò)展的跨平臺(tái)等特性,使得 Java成為開(kāi)發(fā)基于B/S模式的Web數(shù)據(jù)庫(kù)應(yīng)用的首選計(jì)算機(jī)語(yǔ)言。本文使用Java開(kāi)發(fā)一
4、個(gè)高效兼容的HTTP服務(wù)器原型。(如圖一)3該多線程HTTP服務(wù)器使用Serversocket (服務(wù)器套接字)運(yùn)行在 服務(wù)器專用的TCP端口監(jiān)聽(tīng)接收來(lái)自客戶端的請(qǐng)求。當(dāng)遠(yuǎn)程主機(jī)上的客 戶Socket試圖與指定端口建立連接時(shí),服務(wù)器被激活,根據(jù)具體情況來(lái) 確定重用舊線程或生成一個(gè)新線程來(lái)響應(yīng)客戶端的請(qǐng)求直到該客戶退 出。服務(wù)器的主線程仍然處于監(jiān)聽(tīng)狀態(tài),等待新客戶請(qǐng)求。二、HTTP服務(wù)器模型(一)、超文本傳輸協(xié)議 (HTTP, Hypertext Transfer Protocol) 是Web瀏覽器與Web服務(wù)器之間通信的標(biāo)準(zhǔn)協(xié)議,是個(gè)相當(dāng)詳細(xì)的協(xié)議。 位于TCP/IP協(xié)議的應(yīng)用層,具有簡(jiǎn)單、通
5、用、無(wú)狀態(tài)、靈活、無(wú)連接 及面向?qū)ο蟮忍攸c(diǎn)是互聯(lián)網(wǎng)中最核心的協(xié)議之一。HTTP是RPC式的協(xié)議。RPC就是遠(yuǎn)程調(diào)用(Remote Procedure Cal),是請(qǐng)求遠(yuǎn)程機(jī)服務(wù)和 處理機(jī)制。RPC和編程語(yǔ)言中的過(guò)程調(diào)用相似,基于 C/S和B/S模型, 它建立在請(qǐng)求/響應(yīng)(Request/Response的基礎(chǔ)上,服務(wù)端和客戶端可 能位于不同的獨(dú)立系統(tǒng)上,客戶端通過(guò) TCP SOKET向服務(wù)器端口(默 認(rèn)為80)發(fā)送包含請(qǐng)求方法、URL (是對(duì)統(tǒng)一資源定位符(Uniform Resource Locato)用來(lái)標(biāo)識(shí)In ternet上資源的位置。URL類是不能再小 的最小類,它擴(kuò)展Java.la
6、ng.Objec。)和協(xié)議版本信息,請(qǐng)求建立Socket 4連接,客戶的請(qǐng)求通過(guò)Socket被服務(wù)器接收,服務(wù)器對(duì)客戶的請(qǐng)求信息 參數(shù)進(jìn)行分析處理,響應(yīng)一個(gè)狀態(tài)行,對(duì)客戶的請(qǐng)求服務(wù)做出回應(yīng),把 相應(yīng)的資源文檔以流形式通過(guò) Socket傳給客戶瀏覽器,整個(gè)過(guò)程見(jiàn)(圖 二)所示:5JAVA的網(wǎng)絡(luò)通信機(jī)制支持URL的類支持SOCKET的類圖二Socket連接(二)、Java API中網(wǎng)絡(luò)類包簡(jiǎn)介:Java API中按類的形式提供了三種不同層次的網(wǎng)絡(luò)技術(shù)機(jī)制,用URL (統(tǒng)一資源定位符)訪問(wèn)網(wǎng)絡(luò)資源的類,利用Socket套接字)通訊 的類以及DataGran(數(shù)據(jù)報(bào))類。前兩種類方法更能體現(xiàn)Java作
7、為網(wǎng)絡(luò)語(yǔ) 言的特點(diǎn),支持URL類實(shí)際上也是依賴于下層支持 Socket類方法來(lái)實(shí) 現(xiàn)的。相對(duì)來(lái)講,URL是對(duì)WEB勺高層聯(lián)接。Socket是一種底層的連接, 客戶機(jī)和服務(wù)器通過(guò)寫(xiě)入到 Socket的字節(jié)流進(jìn)行通信。Java系統(tǒng)的網(wǎng)絡(luò) 通信機(jī)制如圖二所示,本文主要討論基于Socket類的通信機(jī)制。In ternet圖三JAVA系統(tǒng)的網(wǎng)絡(luò)通信機(jī)制圖四 應(yīng)用程序和 TCP/IP核心協(xié)議關(guān)6協(xié)議組TCP/IP的組合,TCP/IP技術(shù)的核心部分是傳輸層(TCP和 UDP協(xié)議),網(wǎng)絡(luò)層(IP)協(xié)議和物理層(面向各種物理硬件技術(shù)),能實(shí)現(xiàn) 這三層協(xié)議的內(nèi)核可稱之為T(mén)CP/IP網(wǎng)絡(luò)操作系統(tǒng).TCP/IP協(xié)議技
8、術(shù)中的 中下層協(xié)議向外提供的只是原始的編程界面 ,而不是直接的用戶服務(wù), 用戶服務(wù)要靠核外的應(yīng)用程序?qū)崿F(xiàn)應(yīng)用程序和TCP/IP核心協(xié)議關(guān)系如 圖四所示(三)、HTTP客戶機(jī)與服務(wù)器之間的交互涉及下列步驟:1、HTTP服務(wù)器聽(tīng)取請(qǐng)求:HTTP服務(wù)器打開(kāi)聽(tīng)取端口,通常是端口 80,這是在 一個(gè)線程中進(jìn)行的,然后線程阻止,等待入站的HTTP請(qǐng)求。2、HTTP客戶機(jī)構(gòu)造HTTFURLHTTP客戶機(jī)需要建立與 HTTP!艮務(wù)器的初始連接。 為此要使用 URL通常情況下是以http:/www.any_ 的形式。 這里HTTP客戶機(jī)指定HTTP!艮務(wù)器上的缺省資源,通常是頁(yè)面index.htm 或defau
9、lt.htm 。缺省Web頁(yè)面通常是站點(diǎn)的主頁(yè)。有時(shí)候URL會(huì)更加 復(fù)雜。3、HTTP客戶機(jī)建立連接:HTTP客戶機(jī)建立發(fā)送套接,連接 Web 服務(wù)器。發(fā)送套接讓客戶機(jī)向服務(wù)器提交 HTTP請(qǐng)求。4、HTTP服務(wù)器接 受連接:HTTP服務(wù)器生成接受套接,從 HTTP客戶機(jī)接受請(qǐng)求。通常, 接受套接在另一線程中運(yùn)行,提高 Web服務(wù)器的性能。5、HTTP客戶機(jī) 構(gòu)造一個(gè)HTTP請(qǐng)求,發(fā)送到HTTP!艮務(wù)器:建立與HTTP服務(wù)器的連接 之后,客戶機(jī)構(gòu)造HTTP請(qǐng)求并通過(guò)套接將其傳遞到 HTTP月艮務(wù)器。6、 HTTP服務(wù)器處理請(qǐng)求:HTTP服務(wù)器繼續(xù)聽(tīng)取接受套接中的入站請(qǐng)求。 得到請(qǐng)求時(shí),服務(wù)器分
10、析入站請(qǐng)求,并采取請(qǐng)求要求的操作。7、HTTP服務(wù)器將HTTPU向應(yīng)發(fā)送給HTTP客戶機(jī):HTTP月艮務(wù)器構(gòu)造HTTPU向應(yīng), 有六個(gè)部分(1)、HTTP版本;(2)、HTTP狀態(tài)碼;(3)、HTTP狀態(tài)描 述(可選);(4)、響應(yīng)頭字段(可選);(5)、響應(yīng)體(可選);(6)、內(nèi) 7容長(zhǎng)度(可選)。服務(wù)器通過(guò)與HTTP客戶機(jī)的連接返回響應(yīng)。8、HTTP 客戶機(jī)處理響應(yīng):HTTP客戶機(jī)收到服務(wù)器的響應(yīng)時(shí),客戶機(jī)分析響應(yīng), 然后處理響應(yīng)。9、關(guān)閉套接連接:HTTP客戶機(jī)或服務(wù)器關(guān)閉連接。(四)、一次 HHTP 操作稱為一次事務(wù)(Transaction )。HTTP定義的事務(wù)處理由以下四步組成:1
11、、客戶與Web服務(wù)器建立連接,打開(kāi)一個(gè)稱為 socket(套接 字)的虛擬文件,此文件的建立標(biāo)志著連接成功。2、 客戶通過(guò)socket向Web服務(wù)器提交請(qǐng)求。一般為GET或POST命令。3、通過(guò)HTTP協(xié)議傳送給Web服務(wù)器。接納則進(jìn)行事務(wù)處理,處理結(jié)果傳回客戶端。4 、客戶和服務(wù)器斷開(kāi)連接。HTTP采用TCP連接,該連接僅在此事務(wù)中保持,瀏覽器和服務(wù)器 都不會(huì)記憶上次的連接狀態(tài)。HTTP之所以采取這種無(wú)狀態(tài)機(jī)制,完全 是為了提高服務(wù)器的工作效率。在 WEB中點(diǎn)擊一個(gè)超鏈接時(shí),瀏覽器 有可能從當(dāng)前站點(diǎn)轉(zhuǎn)到另一個(gè)站點(diǎn)。因此,當(dāng)文檔傳輸完畢時(shí),服務(wù)器 都假定用戶要退出對(duì)文本服務(wù)器上的文檔的瀏覽連接
12、,因而斷開(kāi)連接。 如果繼續(xù)瀏覽,就再次建立連接。如果用戶確實(shí)要退出時(shí),服務(wù)器就不 需要執(zhí)行任何操作,因?yàn)檫B接已經(jīng)斷開(kāi)了。(五)、HTTP消息包括HTTP請(qǐng)求信息和HTTP響應(yīng)消息兩種,一個(gè) HTTP請(qǐng)求格式如下圖五所示:MehodURLVersio n請(qǐng)求頭Header field n ameValue頭信息8Header field n ameValueEn tity Body圖五 HTTP請(qǐng)求信息格式HTTP響應(yīng)信息格式如圖六所示:VersionStatus codeVersion回應(yīng)狀態(tài)消息Header field n ameValue頭信息Header field n ameValue
13、En tity Body圖六 HTTP 響應(yīng)信息格式三、HTTP服務(wù)器的兼容性(一) 、 HTTP1.1的兼容性:要實(shí)現(xiàn)一個(gè)實(shí)用高效的 HTTP1.1 和 CGI 兼容 HTTP 服務(wù)器, HTTP1.1 主要通過(guò)引入持久連接和更好的緩存驗(yàn)證命令而提高性能,而 且把 HTTP 響應(yīng)代碼增加一倍多。能夠向上兼容 HTTP/1.0,HTTP 消息 包括請(qǐng)求消息和響應(yīng)信息兩種。(二) 、 HTTP1.0 的兼容性:HTTP1.0 兼容服務(wù)器總是要響應(yīng)請(qǐng)求的 HTTP 版本,可能是HTTP0.9或HTTP1.0。HTTPResquest要檢查請(qǐng)求中是否存在版本號(hào)。 如 果不存在,則假設(shè)為HTTP0.9
14、。這個(gè)版本不用頭。其中在HTTP1.0版本 里請(qǐng)求頭的method可能為GET、POST或HEAD,而在HTTP1.1版本 中增加了 PUT 和 DELETE 兩種請(qǐng)求。 URL 統(tǒng)一資源定位器標(biāo)明了目的 位置。(三) 、 與舊版本 HTTP 的兼容性:9HTTP1.0規(guī)范強(qiáng)制要求與HTTP.09的向下兼容性。我們要保證HTTP 服務(wù)器具有下列功能:1、識(shí)別HTTP0.9與HTTP1.0請(qǐng)求的請(qǐng)求行格式。2、了解HTTP0.9與HTTP1.0格式的任何有效請(qǐng)求。3、響應(yīng)與客戶機(jī)使用的相同協(xié)議版本消息。四、Java實(shí)現(xiàn)多線程HTTP服務(wù)器設(shè)計(jì)(一)、 Java 語(yǔ)言網(wǎng)絡(luò)編程在 java 的客戶/
15、服務(wù)器應(yīng)用中, 客戶與服務(wù)器之間的通訊一般 是采用基于 TCP/IP 的 Socket 機(jī)制來(lái)實(shí)現(xiàn)的。當(dāng)通信數(shù)據(jù)到達(dá)的是目的主機(jī)網(wǎng)絡(luò)層, IP 地址連同端口號(hào)一起, 提供了對(duì)兩臺(tái)機(jī)器之間 唯一的無(wú)二義性的連接的標(biāo)識(shí),這個(gè)連接叫套接字(Socket )。一對(duì)套接字為一標(biāo)識(shí)了每個(gè)端口連接: (1)發(fā)送方套接字 =源 IP 地址 +源端口號(hào);(2)接收方套接字 =目的 IP 地址 +目的端口號(hào)。Socket 類實(shí)現(xiàn)基于連接客戶插口。我們可以利用 Java API 中 的 J 包中的插口類提供的套接字功能進(jìn)行網(wǎng)絡(luò)編程。Socket 類(套接字類) 提供的重要函數(shù)有 getInetAddress( ),
16、 getPort( ), getInputStream( ), 和 close( ) 。分別產(chǎn)生用于 獲得信宿機(jī)的地址、信宿機(jī)端口號(hào)、獲得輸入流、獲得輸出流、關(guān) 閉套接字。ServerSocket 類 ( 服 務(wù) 器 套 接 字 類 ) 的 重 要 函 數(shù) 有 : getInetAddress( ), getLocalPort( ), accept( ) 和 close( ) , 分別用于獲得信宿機(jī)的 Internet 地址、本地端口、監(jiān)聽(tīng)和關(guān)閉套 接字。ServerSocket類實(shí)現(xiàn)了 TCP月服務(wù)器插口。它提供兩種構(gòu)造函 數(shù)指定服務(wù)器插口所用的端口, 以便監(jiān)聽(tīng)到連接請(qǐng)求。 利用 Accep
17、t( ) 方法引發(fā)服務(wù)器插口監(jiān)聽(tīng)并等待,一旦連接就返回一個(gè)實(shí)例。10自定義類包括( 1)HttpServer 類(服務(wù)器類),( 2) ReThead (線程重用類),(3) HttpProcess (一個(gè)接口類)。此外還包括各 個(gè)類的請(qǐng)求處理類3個(gè):HttpFile (靜態(tài)文件處理),HttpCGI (CGI 處理) ,HttpException (出錯(cuò)處理) ;以及數(shù)據(jù)流處理 2 個(gè): HttpInputstream (數(shù)據(jù)輸入流)和 HttpOutputstream (數(shù)據(jù)輸出 流)。11生成請(qǐng)求的對(duì)象HTTPFileObjectHTTPProcessObject圖七重要類的交互(二)、
18、服務(wù)器總體設(shè)計(jì)1、 總體設(shè)計(jì)的關(guān)鍵點(diǎn)根據(jù)HTTP工作原理,在這個(gè)設(shè)計(jì)中抓住了幾個(gè)關(guān)鍵點(diǎn):(1)持續(xù) 12監(jiān)聽(tīng)。根據(jù)TCP/IP,作為服務(wù)器端進(jìn)行監(jiān)聽(tīng)。在這個(gè)設(shè)計(jì)中,采用了一 個(gè)永真的循環(huán),等待客戶的連接請(qǐng)求。( 2)可以同時(shí)接受多個(gè)用戶的連接請(qǐng)求。每個(gè)用戶擁有自己獨(dú)立的線程。(3)實(shí)現(xiàn)了線程的重用性。線程重用服務(wù)可以自動(dòng)收集可重用的線程,以免過(guò)的的創(chuàng)建與銷毀線程增 加系統(tǒng)的負(fù)擔(dān),提高了系統(tǒng)的效率。2、模塊設(shè)計(jì)把 Http 服務(wù)器分成兩個(gè)組成模塊: 客戶請(qǐng)求處理模塊和響應(yīng)生成發(fā) 送模塊,其中客戶請(qǐng)求處理模塊負(fù)責(zé)接收客戶的連接,分析請(qǐng)求中的各 個(gè)協(xié)議參數(shù),此外還負(fù)責(zé)調(diào)用響應(yīng)生成發(fā)送模塊。而響應(yīng)生成
19、發(fā)送模塊 的任務(wù)就是根據(jù)對(duì)客戶請(qǐng)求的分析的結(jié)果查找資源,生成響應(yīng)和發(fā)送響 應(yīng)。(1)、客戶請(qǐng)求處理模塊的任務(wù)就是負(fù)責(zé)監(jiān)聽(tīng)系統(tǒng)的端口, 以獲取 客戶機(jī)到達(dá)本機(jī)的連接。當(dāng)獲得一個(gè)連接請(qǐng)求時(shí),就把這一連接所建立 的套接字連接交給一個(gè)負(fù)責(zé)客戶請(qǐng)求處理程序 Client 類處理這一 個(gè)客戶的請(qǐng)求,之后程序繼續(xù)監(jiān)聽(tīng)等待下一個(gè)客戶的連接。在一個(gè) Client 對(duì)象建立之后,它就把其在初始化時(shí)獲得的一個(gè) Socket 對(duì)象的 輸入流重定向給一個(gè) Request 對(duì)象,使其能通過(guò) Request 類提供的接口 方法獲取這一用戶請(qǐng)求的相關(guān)參數(shù),如URL的組成請(qǐng)求方法,所指文件以及協(xié)議版本等數(shù)據(jù)。然后把這一個(gè) Re
20、quest 對(duì)象連同 Socket 對(duì)象的 輸出流傳遞給一個(gè) ResourceHandler 類的 實(shí)例, 由這一個(gè) ResourceHandler 對(duì)象完成生產(chǎn)發(fā)送對(duì)用戶請(qǐng)求的響應(yīng)。主要由三個(gè)部 分組成:守護(hù)程序:一個(gè) HttpServer類的實(shí)例對(duì)象;客戶處理程序:一個(gè)Client用戶類,由HttpServer對(duì)象負(fù)責(zé)建立其實(shí)例和執(zhí)行其 運(yùn)行線程;請(qǐng)求分析程序:一個(gè)Request用戶類,由Client對(duì)象初始化其對(duì)象實(shí)例,用于分析客戶請(qǐng)求中的協(xié)議參數(shù)(如下圖八)。其中,1-調(diào)用;2-Socket 對(duì)象;3-Socket 對(duì)象;4-Socket 對(duì)象13輸入流;5-Request對(duì)象;6-S
21、ocket對(duì)象的輸入流和 Request對(duì)象。Request對(duì)象是指經(jīng)分析的客戶請(qǐng)求。圖八請(qǐng)求處理模塊(2)、響應(yīng)生成發(fā)送模塊實(shí)現(xiàn)的功能就是從客戶請(qǐng)求程序中接受一 個(gè)Request對(duì)象和一個(gè)標(biāo)識(shí)一個(gè)用戶連接的客戶Socket對(duì)象的輸入流(HttpInputStream )對(duì)象。通過(guò) Request對(duì)象中獲得客戶請(qǐng)求的協(xié)議參數(shù),查找客戶請(qǐng)求指定的資源,根據(jù)查找的結(jié)果,生成相應(yīng)的響應(yīng), 并把生成的響應(yīng)寫(xiě)入到指定的 HttpI nputStream 對(duì)象中,其操作結(jié)果就 是把響應(yīng)送往客戶。包含了以下對(duì)象:ResourceHandler對(duì)象(響應(yīng)產(chǎn)生發(fā)送處理)、SCManager(響應(yīng)的狀態(tài)碼管理)對(duì)
22、象、StatusCode對(duì)象(狀態(tài)碼管理)、MimeType對(duì)象(媒體類型描述處理),通過(guò)相互調(diào)用協(xié) 調(diào),共同完成模塊的功能(如圖六)。其中:1 Socket對(duì)象的輸入流 和Request對(duì)象;2文件名;3文件描述;4狀態(tài)碼;5狀態(tài)碼相關(guān)描述;6文件名;7媒體類型描述143、HTTP月艮務(wù)器各類之間關(guān)系在Http服務(wù)器的設(shè)計(jì)中,Httpserver是主類,提供了程序的入口, 打開(kāi)ServerSocket類,并且接受客戶端的連接。對(duì)于每個(gè)連接將創(chuàng)建 一個(gè)新的Httpserver對(duì)象去處理客戶端的請(qǐng)求,并且啟動(dòng)一個(gè)新的線 程去執(zhí)行該處理。Httplnputstream 類對(duì)于請(qǐng)求信息進(jìn)行分析。 H
23、ttpProcessor類則提供了真正處理的接口,它分別被HttpFile 類,HttpCGI類,HttpException 類來(lái)實(shí)現(xiàn)。最后將響應(yīng)信息由 HttpOutputStream類格式化輸出到客戶端。HTTP)艮務(wù)器類圖設(shè)計(jì)如(圖 十)所示:15圖十HTTP服務(wù)器類圖(三)、服務(wù)器詳細(xì)設(shè)計(jì)分析1、 線程重用在這個(gè)設(shè)計(jì)中用 Rethread類來(lái)劃分線程,這個(gè)類用一個(gè)矢量(Vector)來(lái)存儲(chǔ)線程。這樣避免了舊線程的銷毀,并且當(dāng)客戶端有請(qǐng)求過(guò)來(lái)時(shí),避免了新線程的創(chuàng)建,提高了服務(wù)器的響應(yīng)效率。2、 各類和接口的主要功能(1)、HTTPServerHTTPServer.java中定義了一個(gè)變量
24、類resources,保存這個(gè)類的所 有場(chǎng)景特定消息。把這個(gè)變量定義為靜態(tài)的,因?yàn)樗陟o態(tài)main() 方法中使用。(2)、HTTPRequestHTTPReque類處理HTTP請(qǐng)求。對(duì)于每個(gè)接受的連接,HTTPServer run()方法構(gòu)造一個(gè)HTTPRequest對(duì)象并傳入從accept()調(diào)用取得16的套接參數(shù),作為服務(wù)器與瀏覽器進(jìn)行通信的端點(diǎn)。構(gòu)造HTTPRequest對(duì)象之后,run()方法調(diào)用start(),使請(qǐng)求在并發(fā)運(yùn) 行的線程中處理。這樣 HTTPServer類的run()方法可以立即繼續(xù), 等待新的入站連接。(2)、HTTP In PutStream對(duì)于每個(gè)請(qǐng)求信息,用
25、HTTP In PutStream類來(lái)進(jìn)行分析處理,包括 解釋請(qǐng)求和讀取所有請(qǐng)求報(bào)頭。 把這個(gè)類中請(qǐng)求進(jìn)行分解為方法、 請(qǐng)求路徑、查詢字符串以及協(xié)議版本, 并且讀取所有隨后的請(qǐng)求報(bào) 頭。(3)、HTTPOutPutStream經(jīng)過(guò)處理后的響應(yīng)信息經(jīng)過(guò) HTTPOutPutStream類進(jìn)行格式化輸入 到客戶端,這個(gè)類為寫(xiě) HTTP響應(yīng)提供了支持,在這個(gè)類中添加了 形成和發(fā)送HTTP響應(yīng)報(bào)頭的支持,包括狀態(tài)行和隨后的報(bào)頭。(4)、HTTPProcessorHTTPProcessor接口提供了真正處理的方法,HTTPFile類,HTTPCGI 類, HTTPException 類分別實(shí)現(xiàn)了該接口。
26、根據(jù) HTTPInPutStream 類的分析來(lái)確定所有請(qǐng)求的信息該有哪個(gè)類來(lái)處理。 (HTTPFile 類、HTTPCG類或 HTTPException 類)(5)、HTTPFile該類實(shí)現(xiàn)了 HTTPProcessor接口,用于處理靜態(tài)文件資源的get和 head 請(qǐng)求。(6)、HTTPCGI該類實(shí)現(xiàn)了 HTTPProcessor接口,用于處理CGI程序。(7)、HTTPException該類是IOException的子類,它用于把HTTP錯(cuò)誤返回到客戶機(jī)。 17它實(shí)現(xiàn)HTTPProcessor接口,因此當(dāng)在響應(yīng)客戶機(jī)請(qǐng)求而被拋出時(shí), 他能夠發(fā)送一個(gè)適當(dāng)?shù)腍TTP錯(cuò)誤信息到客戶機(jī)。(四)、
27、Java多線程機(jī)制的應(yīng)用多線程( Multi-Thread )是 Java 的一個(gè)重要特性,指的是通 過(guò)系統(tǒng)的調(diào)度使幾個(gè)具有不同功能的程序流即線程同時(shí)并行的運(yùn) 行。Java 從語(yǔ)言一級(jí)提供對(duì)線程的支持, 可由語(yǔ)言和運(yùn)行系統(tǒng)聯(lián)合 提供對(duì)共享數(shù)據(jù)段的管理功能和同步機(jī)制,這樣就使多線程并行程 序設(shè)計(jì)相對(duì)比較容易。在 Java 中 , 當(dāng) 我 們 創(chuàng) 建 一 個(gè) 新 線 程 時(shí) , 先 通 過(guò) 對(duì) Java.lang.Thread 類的 繼承來(lái)派生一個(gè)子類 class MyApplication extends Thread 然后,通過(guò)run()方法實(shí)現(xiàn)線程的行為。 class MyApplicati
28、on extends Thread public void run( ) 最后,由子類生成一個(gè)對(duì)象,并且進(jìn)行啟動(dòng)操作,這樣就得到一個(gè)處于可運(yùn)行狀態(tài)的線程。生成對(duì)象是完成線程的創(chuàng) 建,啟動(dòng)則是對(duì)已經(jīng)創(chuàng)建的線程進(jìn)行操作。My Application ex=new My Application( );Thread th=new Thread(ex);Th.start( );這個(gè)服務(wù)器端程序以最簡(jiǎn)單的方式運(yùn)用Socket對(duì)服務(wù)器和客戶機(jī)進(jìn)行操作。服務(wù)器的全部工作就是等候建立一個(gè)連接,然后用那 個(gè)連接產(chǎn)生的 Socket創(chuàng)建一個(gè)InputStream以及一個(gè)Outputstream。 在 這 之后 ,
29、它 從 InputStream 讀入 的所 有 東西 都會(huì) 反饋給 Outputstream,直到接收到行中止(END)為止,最后關(guān)閉連接。public class myServer / 這個(gè)是服務(wù)器端程序/ 設(shè)定服務(wù)程序端口號(hào) ,大于 1024 public static final int PORT = 188080;public static void main(String args)throws IOExceptionServerSocket s = new ServerSocket(PORT);System.out.println(Started:+s);trySocket soc
30、ket = s.accept();trySystem.out.println ( 連接被接受 +socket);BufferedReader in =NewBufferedReader(newInputStreamReader(socket.getInputStream();PrintWriter out =new PrintWriter(new BufferedWriter(newOutputStreamWriter(socket.getOutputStream(),true);while(true)String str = in.readLine(); if(str.endsWith(EN
31、D) break; System.out.println(Echoing: +str); out.println(str);catch(Exception e) System.out.println(e.toString();fin allySystem.out.pri ntln (clos ing .); socket.close();19 fin allys.close(); 圖十一多線程服務(wù)端實(shí)例F面是該服務(wù)器設(shè)計(jì)的部分代碼:* get Conn ect Info*/public String getC onnectln fo()Stri ngszClie ntHostName=this
32、.m_sClie nt .getI netAddress().getHostName ();String szClie ntAddress=this.m_sClie nt .getI netAddress().getHostAddress();int ClientPort=this.m_sClient .getPort ();String szRet=;szRet=Accepted connection from +szClientHostName+(+szClientAddress+) +on port +ClientPort+.;20return szRet;HTTPRequest(Soc
33、ket client)throws IOException this.m_sClient =client;this.m_In =new HttpInputStream(this.m_sClient.getInputStream();this.getRequest (); public String getLog()StringBuffer szRet=new StringBuffer() ;szRet.append (Received the following request:+n);Enumeration enum=m_vLines.elements ();String szstr1=;
34、while(enum.hasMoreElements() szstr1=(String)enum.nextElement(); szRet.append (szstr1+n);return szstr1.toString();boolean isGetRequest() if(this.m_vLines .size ()0)String firstline=(String)this.m_vLines.elementAt (0);if(firstline.length ()0) if(firstline.substring(0,3).equalsIgnoreCase(GET)return tru
35、e; return false;21* only use to recognize methed get*/class HttpInputStream extends FilterInputStream HttpInputStream(InputStream in)super(in);public void addLine(String line) m_vLines .addElement(line);public String readLine() throws IOException StringBuffer result=new StringBuffer (); boolean finished=false;boolean isenter=falsePublic static void main (String args) throws IOException ServerSocket server = new ServerSocket (8080);/* 創(chuàng)建一個(gè)監(jiān)聽(tīng) 8080 端口的服務(wù)器套接字 */While(time)Socket client = server.accept ( );/* 等待一個(gè)連接,如果該連接未被創(chuàng)建,本方法阻塞當(dāng)前線程。 返回值是一個(gè) Socket 對(duì)象,服務(wù)器程序利用這個(gè)對(duì)象與連接的客 22戶通信。 */H
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 朝陽(yáng)小區(qū)買賣房屋合同三篇
- 2024年委托代建合同協(xié)議
- 2024年工程分包財(cái)務(wù)結(jié)算
- 2024年個(gè)人委托代理協(xié)議
- 教師教學(xué)水平提升計(jì)劃
- 嶺南師范學(xué)院《園林計(jì)算機(jī)輔助設(shè)計(jì)Ⅱ》2021-2022學(xué)年期末試卷
- 2(2024版)商場(chǎng)多功能廳租賃合同
- 2024年展會(huì)交流合作協(xié)議書(shū)
- 嶺南師范學(xué)院《教學(xué)技能訓(xùn)練Ⅱ》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024年城市公共交通無(wú)人駕駛車輛采購(gòu)合同
- 職業(yè)生涯規(guī)劃-醫(yī)生職業(yè)說(shuō)明
- 信息資源目錄編制規(guī)范(用于個(gè)人參考學(xué)習(xí)版本)
- 互聯(lián)網(wǎng)的定義及發(fā)展歷程
- 馬克思主義基本原理智慧樹(shù)知到課后章節(jié)答案2023年下齊魯工業(yè)大學(xué)
- 蘇教版譯林初中英語(yǔ)詞匯表(七年級(jí)至九年級(jí))
- 學(xué)而思小學(xué)奧數(shù)知識(shí)體系
- 教育科學(xué)研究方法的教案
- 輸精管吻合術(shù)后護(hù)理查房
- 一年級(jí)上冊(cè)數(shù)學(xué)單元測(cè)試-第八單元 20以內(nèi)的進(jìn)位加法(培優(yōu)卷) 人教版(含答案)
- 2016年軟考中級(jí)系統(tǒng)集成項(xiàng)目管理工程師下午《應(yīng)用技術(shù)》真題及答案
- 平衡計(jì)分卡-化戰(zhàn)略為行動(dòng)
評(píng)論
0/150
提交評(píng)論