簡(jiǎn)單Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)_第1頁
簡(jiǎn)單Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)_第2頁
簡(jiǎn)單Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)_第3頁
簡(jiǎn)單Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)_第4頁
簡(jiǎn)單Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、瓊州學(xué)院電子信息工程學(xué)院課程設(shè)計(jì)報(bào)告 課程名稱: 計(jì)算機(jī)網(wǎng)絡(luò) 設(shè)計(jì)題目:簡(jiǎn)單web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn) 專 業(yè): 軟件工程 學(xué)生姓名:王永浩(11241056)、宋雨(11241060) 夏成鵬(11241066)、黃兵周(11241007) 指導(dǎo)教師: 陳德祥 日 期: 2014年4月6日指導(dǎo)教師評(píng)語: 最終成績(jī): 指導(dǎo)教師簽名: 年 月 日成績(jī)?cè)u(píng)定項(xiàng) 目權(quán) 重成 績(jī)1、設(shè)計(jì)過程中的學(xué)習(xí)態(tài)度0.22、課程設(shè)計(jì)的質(zhì)量及答辯0.53、設(shè)計(jì)報(bào)告書規(guī)范程度0.34、總成績(jī) 目錄摘 要- 2 -1前 言- 2 -1.1 課程設(shè)計(jì)前準(zhǔn)備- 2 -1.2 課程設(shè)計(jì)的內(nèi)容- 3 -1.3 課程設(shè)計(jì)要求- 3 -

2、1.4 課程設(shè)計(jì)平臺(tái)- 3 -2 Web服務(wù)器的工作原理- 4 -2.1 HTTP協(xié)議的作用原理- 4 -2.2 Java開發(fā)語言相關(guān)知識(shí)與技術(shù)- 5 -2.2.1 java中的多線程及實(shí)現(xiàn):- 5 -2.2.2 IO字節(jié)流操作- 7 -2.2.3 網(wǎng)絡(luò)架構(gòu):- 9 -3開發(fā)環(huán)境及套字接編程- 10 -3.1 Web服務(wù)器的開發(fā)環(huán)境- 10 -3.2 Web服務(wù)器的套接字編程- 11 -3.2.1 ServerSocket類- 11 -4 WEB服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)- 12 -4.1 Web服務(wù)器的程序設(shè)計(jì)流程- 12 -4.2 用Java實(shí)現(xiàn)Web服務(wù)器的主要設(shè)計(jì)步驟及程序- 13 -5測(cè)試運(yùn)

3、行- 20 -5.1 調(diào)試運(yùn)行- 20 -結(jié)束語- 21 -參考文獻(xiàn)- 22 -摘 要WWW的工作基于客戶機(jī)/服務(wù)器計(jì)算模型,由Web 瀏覽器(客戶機(jī))和Web服務(wù)器(服務(wù)器)構(gòu)成,兩者之間采用超文本傳送協(xié)議(HTTP)進(jìn)行通信,HTTP協(xié)議的作用原理包括四個(gè)步驟:連接,請(qǐng)求,應(yīng)答,關(guān)閉應(yīng)答。在課程設(shè)計(jì)中,系統(tǒng)開發(fā)平臺(tái)為Win7,程序設(shè)計(jì)語言采用Java,程序運(yùn)行平臺(tái)為Eclipse。在程序設(shè)計(jì)中,采用了結(jié)構(gòu)化與面向?qū)ο髢煞N解決問題的方法。程序通過調(diào)試運(yùn)行,初步實(shí)現(xiàn)了設(shè)計(jì)目標(biāo),并且經(jīng)過適當(dāng)完善后,將可以應(yīng)用在商業(yè)中解決實(shí)際問題。關(guān)鍵詞:Java;HTTP;Web服務(wù)器 1前 言Internet

4、是目前世界上最大的計(jì)算機(jī)互聯(lián)網(wǎng)絡(luò),與大家的生活、學(xué)習(xí)、工作有著越來越密切的關(guān)系,它遍布全球,將世界各地各種規(guī)模的網(wǎng)絡(luò)連接成一個(gè)整體,其用戶群十分龐大,因此,建設(shè)一個(gè)好的Web站點(diǎn)對(duì)于一個(gè)機(jī)構(gòu)的發(fā)展十分重要。近年來,隨著網(wǎng)絡(luò)用戶要求的不斷提高及計(jì)算機(jī)科學(xué)的迅速發(fā)展,特別是數(shù)據(jù)庫技術(shù)在Internet中的廣泛應(yīng)用,Web站點(diǎn)向用戶提供的服務(wù)將越來越豐富,越來越人性化。本課程設(shè)計(jì)主要解決由Web 瀏覽器(客戶機(jī))和Web服務(wù)器(服務(wù)器)構(gòu)成,兩者之間采用超文本傳送協(xié)議(HTTP)進(jìn)行通信的Web服務(wù)器的程序設(shè)計(jì)。1.1 課程設(shè)計(jì)前準(zhǔn)備以下的工作均是建立在大量的調(diào)查基礎(chǔ)上的,是Web服務(wù)器開發(fā)前期準(zhǔn)備

5、工作所解決的問題。(1)Java簡(jiǎn)介Java是由sun公司開發(fā)的一種新型的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,主要用于web頁面的設(shè)計(jì)1。Java語言的流行除了因?yàn)樗軌蚓幹魄度際TML文件中的Applet外,還在于Java語言本身的面向?qū)ο?、?jiǎn)單、平臺(tái)無關(guān)性、安全性、多線程等特點(diǎn)。Java語言的發(fā)展頗具傳奇性,它與Internet的WWW的迅猛發(fā)展是分不開的。由于其發(fā)展迅速,有人將它比喻為Internet上的世界語。前面講到在Internet上Web頁面的設(shè)計(jì)采用的是HTML語言,用戶借助于Web瀏覽器(如Netscape,HotJava,IE等),可以訪問到遠(yuǎn)程web服務(wù)器上靜態(tài)的、具有超鏈接的Web

6、頁面2。 (2)HTTP協(xié)議簡(jiǎn)介HTTP 協(xié)議是應(yīng)用層的協(xié)議,定義了服務(wù)器端和客戶端之間文件傳輸?shù)臏贤ǚ绞健TTP協(xié)議用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。由于HTTP協(xié)議支持的服務(wù)不限于WWW,還可以是其它服務(wù),它允許用戶在統(tǒng)一的界面下,采用不同的協(xié)議訪問不同的服務(wù)。它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少。它不僅保證計(jì)算機(jī)正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內(nèi)容首先顯示等3。1.2 課程設(shè)計(jì)的內(nèi)容(1)熟悉WWW服務(wù)器和WEB服務(wù)器的工作原理;(2)熟悉套接字編程的相關(guān)知識(shí);(3)完成一個(gè)簡(jiǎn)單的WEB服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn),要求能夠通過HTTP GET

7、命令獲得一個(gè)簡(jiǎn)單的HTML文件;(4)運(yùn)行該服務(wù)器,并編寫一個(gè)簡(jiǎn)單的HTML文件完成測(cè)試。1.3 課程設(shè)計(jì)要求(1)按要求編寫課程設(shè)計(jì)報(bào)告書,能正確闡述設(shè)計(jì)結(jié)果。(2)通過課程設(shè)計(jì)培養(yǎng)學(xué)生嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度,認(rèn)真的工作作風(fēng)和團(tuán)隊(duì)協(xié)作。(3)學(xué)會(huì)文獻(xiàn)檢索的基本方法和綜合運(yùn)用文獻(xiàn)的能力。(4)在老師的指導(dǎo)下,要求每個(gè)學(xué)生獨(dú)立完成課程設(shè)計(jì)的全部?jī)?nèi)容。1.4 課程設(shè)計(jì)平臺(tái) Windows7系統(tǒng)、Eclipse軟件平臺(tái)。2 Web服務(wù)器的工作原理2.1 HTTP協(xié)議的作用原理WWW是以Internet作為傳輸媒介的一個(gè)應(yīng)用系統(tǒng),WWW網(wǎng)上最基本的傳輸單位是Web網(wǎng)頁。WWW的工作基于客戶機(jī)/服務(wù)器計(jì)算模型,

8、由Web 瀏覽器(客戶機(jī))和Web服務(wù)器(服務(wù)器)構(gòu)成,兩者之間采用超文本傳送協(xié)議(HTTP)進(jìn)行通信。HTTP協(xié)議是基于TCP/IP協(xié)議之上的協(xié)議,是Web瀏覽器和Web服務(wù)器之間的應(yīng)用層協(xié)議,是通用的、無狀態(tài)的、面向?qū)ο蟮膮f(xié)議。HTTP協(xié)議的作用原理包括四個(gè)步驟:連接,請(qǐng)求,應(yīng)答,關(guān)閉應(yīng)答。 HTTP協(xié)議的作用原理包括四個(gè)步驟: (1) 連接:Web瀏覽器與Web服務(wù)器建立連接,打開一個(gè)稱為socket(套接字)的虛擬文件,此文件的建立標(biāo)志著連接建立成功。 (2) 請(qǐng)求:Web瀏覽器通過socket向Web服務(wù)器提交請(qǐng)求。HTTP的請(qǐng)求一般是GET或POST命令(POST用于FORM參數(shù)的

9、傳遞)。GET命令的格式為: GET 路徑/文件名 HTTP/1.0 。其中文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。 (3) 應(yīng)答:Web瀏覽器提交請(qǐng)求后,通過HTTP協(xié)議傳送給Web服務(wù)器。Web服務(wù)器接到后,進(jìn)行事務(wù)處理,處理結(jié)果又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請(qǐng)求的頁面。 例:假設(shè)客戶機(jī)與:8080/mydir/index.html建立了連接,就會(huì)發(fā)送GET命令:GET /mydir/index.html HTTP/1.0。主機(jī)名為 的Web服務(wù)器從它的文檔空間中搜索子目錄mydir的文件index.html。如果找到該文

10、件,Web服務(wù)器把該文件內(nèi)容傳送給相應(yīng)的Web瀏覽器。 為了告知 Web瀏覽器傳送內(nèi)容的類型,Web服務(wù)器首先傳送一些HTTP頭信息,然后傳送具體內(nèi)容(即HTTP體信息),HTTP頭信息和HTTP體信息之間用一個(gè)空行分開。 (4) 關(guān)閉連接:當(dāng)應(yīng)答結(jié)束后,Web瀏覽器與Web服務(wù)器必須斷開,以保證其它Web瀏覽器能夠與Web服務(wù)器建立連接。 2.2 Java開發(fā)語言相關(guān)知識(shí)與技術(shù)Java主要技術(shù)有:多線程,I/O流操作,網(wǎng)絡(luò)編程。2.2.1 java中的多線程及實(shí)現(xiàn):Java是面向?qū)ο蟮某绦蛘Z言,用Java進(jìn)行程序設(shè)計(jì)就是設(shè)計(jì)和使用類,Java為我們提供了線程類Thread來創(chuàng)建線程,創(chuàng)建線程

11、與創(chuàng)建普通的類的對(duì)象的操作是一樣的,而線程就是Thread類或其子類的實(shí)例對(duì)象。下面是一個(gè)創(chuàng)建啟動(dòng)一個(gè)線程的語句: Thread thread1=new Thread(); file:/聲明一個(gè)對(duì)象實(shí)例,即創(chuàng)建一個(gè)線程; Thread1.run(); file:/用Thread類中的run()方法啟動(dòng)線程; 從這個(gè)例子,我們可以通過Thread()構(gòu)造方法創(chuàng)建一個(gè)線程,并啟動(dòng)該線程。事實(shí)上,啟動(dòng)線程,也就是啟動(dòng)線程的run()方法,而Thread類中的run()方法沒有任何操作語句,所以這個(gè)線程沒有任何操作。要使線程實(shí)現(xiàn)預(yù)定功能,必須定義自己的run()方法。Java中通常有兩種方式定義run

12、()方法: 通過定義一個(gè)Thread類的子類,在該子類中重寫run()方法。Thread子類的實(shí)例對(duì)象就是一個(gè)線程,顯然,該線程有我們自己設(shè)計(jì)的線程體run()方法,啟動(dòng)線程就啟動(dòng)了子類中重寫的run()方法。 通過Runnable接口,在該接口中定義run()方法的接口。所謂接口跟類非常類似,主要用來實(shí)現(xiàn)特殊功能,如復(fù)雜關(guān)系的多重繼承功能。線程被實(shí)際創(chuàng)建后處于待命狀態(tài),激活(啟動(dòng))線程就是啟動(dòng)線程的run()方法,這是通過調(diào)用線程的start()方法來實(shí)現(xiàn)的。 線程狀態(tài):1)New當(dāng)線程對(duì)象被創(chuàng)建時(shí),處于該狀態(tài)。 2)Runnable:就緒狀態(tài),線程滿足運(yùn)行的所有條件但沒有正在運(yùn)行的線程位于

13、該狀態(tài),有以下幾種情況: a.處于New狀態(tài)的線程執(zhí)行start()。 b.處于Running狀態(tài)的線程失去CPU。 c.處于Otherwise Block狀態(tài)的線程阻塞解除。 d.處于Lock Block狀態(tài)的線程阻塞解除。 3)Running:運(yùn)行狀態(tài)處于運(yùn)行狀態(tài)的線程可能發(fā)生以下幾種情況: a.線程運(yùn)行結(jié)束,進(jìn)入Dead狀態(tài)。 b.CPU被分配給其它線程,進(jìn)入Runnable狀態(tài)。 c.滿足Otherwise Block的條件,進(jìn)入Otherwise Block狀態(tài)。 d.由于鎖的原因無法執(zhí)行,進(jìn)入Lock Block狀態(tài)。 e.由于等待的原因無法執(zhí)行,進(jìn)入Wait Block狀態(tài)。 4

14、)Dead:死亡狀態(tài)線程運(yùn)行結(jié)束,對(duì)于主線程main()結(jié)束,對(duì)于普通用戶線程run()結(jié)束。 5)Otherwise Block:阻塞狀態(tài),阻塞解除后進(jìn)入Runnable狀態(tài) a.調(diào)用sleep(),阻塞解除條件為阻塞時(shí)間滿。 b.調(diào)用join(),阻塞解除條件為調(diào)用join()的線程執(zhí)行結(jié)束。注意:線程進(jìn)入該狀態(tài)不會(huì)釋放鎖。 6)Lock Block:鎖阻塞狀態(tài),阻塞解除后進(jìn)入Runnable狀態(tài)由于無法獲得需要的鎖而阻塞地線程進(jìn)入該狀態(tài),阻塞解除條件為獲得所需的鎖。 7)Wait Block:等待阻塞狀態(tài),阻塞解除后進(jìn)入Lock Block狀態(tài)由于某個(gè)資源的原因必須進(jìn)行等待,則進(jìn)入該狀態(tài)

15、。阻塞解除條件為其它線程調(diào)用該資源的notify()或notifyAll()。下面一個(gè)例子實(shí)踐了如何通過上述兩種方法創(chuàng)建線程并啟動(dòng)它們: / 通過Thread類的子類創(chuàng)建的線程; class thread1 extends Thread file:/自定義線程的run()方法; public void run() System.out.println(Thread1 is running); file:/通過Runnable接口創(chuàng)建的另外一個(gè)線程; class thread2 implements Runnable file:/自定義線程的run()方法; public void run()

16、System.out.println(Thread2 is running); file:/程序的主類 class Multi_Thread file:/聲明主類; plubic static void mail(String args) file:/聲明主方法; thread1 threadone=new thread1(); file:/用Thread類的子類創(chuàng)建線程; Thread threadtwo=new Thread(new thread2(); file:/用Runnable接口類的對(duì)象創(chuàng)建線程; threadone.start(); threadtwo.start(); fil

17、e:/strat()方法啟動(dòng)線程; 運(yùn)行該程序就可以看出,線程threadone和threadtwo交替占用CPU,處于并行運(yùn)行狀態(tài)??梢钥闯?,啟動(dòng)線程的run()方法是通過調(diào)用線程的start()方法來實(shí)現(xiàn)的(見上例中主類),調(diào)用start()方法啟動(dòng)線程的run()方法不同于一般的調(diào)用方法,調(diào)用一般方法時(shí),必須等到一般方法執(zhí)行完畢才能夠返回start()方法,而啟動(dòng)線程的run()方法后,start()告訴系統(tǒng)該線程準(zhǔn)備就緒可以啟動(dòng)run()方法后,就返回start()方法執(zhí)行調(diào)用start()方法語句下面的語句,這時(shí)run()方法可能還在運(yùn)行,這樣,線程的啟動(dòng)和運(yùn)行并行進(jìn)行,實(shí)現(xiàn)了多任務(wù)

18、操作。2.2.2 IO字節(jié)流操作1)Java中使用流的方式處理數(shù)據(jù),基本的處理類為InputStream(字節(jié)讀入流)和OutputStream(字節(jié)輸出流)。2)可以使用各種過濾流對(duì)流數(shù)據(jù)進(jìn)行過濾,實(shí)現(xiàn)各種附加功能。3)對(duì)字節(jié)流進(jìn)行轉(zhuǎn)換和包裝可以獲得字符流,字符流的基本處理流為Reader(字符讀入流)和Writer(字符輸出流)。a.字節(jié)流:InputStream:int read()讀入流中的一個(gè)字節(jié)并返回,數(shù)據(jù)存放在int的低8位中;int read(byte)讀入流中的若干個(gè)字節(jié),存放在byte中,返回讀入字節(jié)的數(shù)量;int read(byte,int,int)讀入流中的若干個(gè)字節(jié),

19、存放在byte中從第一個(gè)int參數(shù)開始(索引),最大長(zhǎng)度為第二個(gè)int參數(shù)的區(qū)間內(nèi)。OutputStream:flush()將輸出緩沖區(qū)中的信息寫到真正的輸出設(shè)備。調(diào)用方法: 輸出緩沖區(qū)滿:自動(dòng)調(diào)用; 調(diào)用close()時(shí)先調(diào)用flush():自動(dòng)調(diào)用; 手動(dòng)調(diào)用flush()最常見的情況是產(chǎn)生異常時(shí),雖然在finally中會(huì)對(duì)流執(zhí)行close(),但在異常條件下,close()能保證對(duì)流的關(guān)閉,但在調(diào)用flush()時(shí)會(huì)有漏洞。b.字符流:優(yōu)點(diǎn):操作文本數(shù)據(jù)時(shí)比較直觀,讀入和寫出都以char為基本單位。缺點(diǎn):底層依然以字節(jié)流方式操作,所以在任何情況下都必須有轉(zhuǎn)換的過程,效率相對(duì)較低。操作二進(jìn)

20、制數(shù)據(jù)時(shí)會(huì)存在編碼問題,一般不使用字符流操作二進(jìn)制數(shù)據(jù)。InputStreamReader:將字節(jié)讀入流轉(zhuǎn)為字符讀入流。InputStreamReader(InputStream):使用默認(rèn)字符集(取決的JVM)將InpustStream轉(zhuǎn)為InputStreamReader。InputStreamReader(InputStream, String):使用String指定的字符集將InputStream轉(zhuǎn)為InputStreamReader。OutputStreamWriter:將字符輸出流轉(zhuǎn)為字節(jié)輸出流。OutputStreamWriter(OutputStream):使用默認(rèn)字符集(取決

21、于JVM)將OutputStreamWriter轉(zhuǎn)為OutputStream。OutputStreamWriter(OutputStream, String):使用String指定的字符集將OutputStreamWriter轉(zhuǎn)為OutputStream。BufferedReader:提供緩沖;readLine()。BufferedWriter:提供緩沖。PrintWriter:提供緩沖;print()、println()等方法。注意:在開發(fā)中,一般使用BufferedReader和PrintWriter結(jié)合使用完成對(duì)字符流的過濾。2.2.3 網(wǎng)絡(luò)架構(gòu):1)C/S網(wǎng)絡(luò)架構(gòu)客戶端/服務(wù)器架構(gòu),通

22、常情況下,數(shù)據(jù)存儲(chǔ)在服務(wù)器端,客戶端和服務(wù)器端都有一個(gè)獨(dú)立的應(yīng)用程序,可以進(jìn)行獨(dú)立的操作,通過網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸。常用的傳輸協(xié)議包括:TCP/IP:基于連接的協(xié)議優(yōu)點(diǎn):由于是有連接的傳輸,對(duì)于數(shù)據(jù)的準(zhǔn)確性是有保證的。缺點(diǎn):系統(tǒng)資源占用較多。UDP/IP:無連接的協(xié)議(數(shù)據(jù)報(bào))優(yōu)點(diǎn):系統(tǒng)資源占用少。缺點(diǎn):無法保證傳輸?shù)臏?zhǔn)確性。用途:a.對(duì)于數(shù)據(jù)少量丟失可以接受的應(yīng)用。b.存在足夠數(shù)據(jù)冗余的應(yīng)用。2)B/S網(wǎng)絡(luò)架構(gòu)瀏覽器/服務(wù)器架構(gòu),在服務(wù)器端完成幾乎所有的功能(包括數(shù)據(jù)存儲(chǔ)),客戶端的瀏覽器只完成和服務(wù)器交互和顯示服務(wù)器傳輸?shù)男畔⒌墓δ?。常用的傳輸協(xié)議包括:http:超文本傳輸協(xié)議。https:支

23、持多種加密操作的超文本傳輸協(xié)議。優(yōu)點(diǎn):客戶端不需要安裝任何附加軟件,同時(shí)整個(gè)應(yīng)用的升級(jí)也相對(duì)簡(jiǎn)單。IP:通過IP Address和Port(端口)定位具體的應(yīng)用;Port的有效范圍是065535,通常在開發(fā)應(yīng)用時(shí)應(yīng)避免使用1000以下的端口,1000以下有很多端口被常用應(yīng)用占用。IP Address在JDK5.0中支持4位或6位兩種方式,現(xiàn)在4位的占據(jù)主導(dǎo)地位,但將來會(huì)逐漸過渡到6位IP地址的模式。TCP/IP協(xié)議的實(shí)現(xiàn):a.ServerSocket類:服務(wù)器端使用,用于監(jiān)聽客戶端的請(qǐng)求。b.Socket類:服務(wù)器端和客戶端使用,用于完成具體通信的所有功能。UDP/IP協(xié)議的實(shí)現(xiàn):a.Data

24、gramSocket類:服務(wù)器端和客戶端使用,用于實(shí)現(xiàn)通信的基本功能。b.DatagramPacket類:服務(wù)器端和客戶端使用,用于封裝通信的內(nèi)容信息。3開發(fā)環(huán)境及套字接編程3.1 Web服務(wù)器的開發(fā)環(huán)境 該課程設(shè)計(jì)是基于Java編程語言的設(shè)計(jì)的Web服務(wù)器,開發(fā)環(huán)境是Eclipse軟件和Java Swing。(1)Eclipse簡(jiǎn)介 Eclipse 是一個(gè)開放源代碼的、基于 Java 的可擴(kuò)展開發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過插件和組件構(gòu)建開發(fā)環(huán)境。Eclipse 附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括 Java 開發(fā)工具。Eclipse采用的技術(shù)是IBM公司開發(fā)的(SWT),

25、這是一種基于Java的窗口組件,類似Java本身提供的AWT和Swing窗口組件,Eclipse的插件機(jī)制是輕型軟件組件化架構(gòu)。在富客戶機(jī)平臺(tái)上,Eclipse使用插件來提供所有的附加功能4。(2) Java Swing概述Swing是不對(duì)等基于GUI工具箱的正式名字,它是Java基礎(chǔ)類庫的一部分。完整的JFC十分龐大,其中包含的內(nèi)容遠(yuǎn)遠(yuǎn)大于Swing GUI工具箱。JFC特性不僅僅包含了Swing組件,而且還包含了一個(gè)可訪問的API、一個(gè)2D API和一個(gè)可拖拽的API。Swing擁有一個(gè)豐富、便捷的用戶界面元素集合,對(duì)底層平臺(tái)依賴的很少,因此與平臺(tái)相關(guān)的bug很少。Swing給予不同平臺(tái)的

26、用戶一致的感官效果5。3.2 Web服務(wù)器的套接字編程Java提供了一個(gè) ServerSocket類,程序員可以很方便地用它編寫服務(wù)器程序。服務(wù)器套接字的基本功能類似于坐在電話機(jī)旁邊等待呼叫到來。從技術(shù)上講, ServerSocket運(yùn)行在服務(wù)器上并監(jiān)聽到來的 TCP連接。 每個(gè)ServerSocket都在服務(wù)器上的指定端口監(jiān)聽。當(dāng)遠(yuǎn)程主機(jī)上的客戶Socket試圖與指定端口建立連接時(shí),服務(wù)器被激活,判定客戶程序與服務(wù)器的連接,并打開兩個(gè)主機(jī)之間固有的Socket。一旦與服務(wù)器套接字建立了連接,則服務(wù)器就可以使用固有的Socket對(duì)象向客戶機(jī)發(fā)送數(shù)據(jù)。數(shù)據(jù)總是通過固有的套接字傳遞。3.2.1 S

27、erverSocket類 ServerSocket類包含了用 Java編寫服務(wù)器程序的所有內(nèi)容。它包括創(chuàng)建新 ServerSocket對(duì)象的構(gòu)造器、在指定端口監(jiān)聽連接的方法,以及連接建立后可以發(fā)送和接收數(shù)據(jù)時(shí)返回 Socket對(duì)象的方法。此外,它還有設(shè)置不同選項(xiàng)以及各種各樣常用的方法,例如 toString()方法。 服務(wù)器的基本生命期是: 1. 利用 ServerSocket()構(gòu)造器在指定端口創(chuàng)建一個(gè)新的 ServerSocket; 2. ServerSocket利用它的accept()方法在指定端口監(jiān)聽到來的連接。accept()方法一直處于阻塞狀態(tài),直到有客戶機(jī)試圖建立連接。這時(shí) ac

28、cept()方法返回連接客戶機(jī)何服務(wù)器的 Socket; 3. 調(diào)用 getInputStream()方法、getOutputStream()方法或者兩者都調(diào)用來得到與客戶機(jī)通信的輸入流和輸出流,具體調(diào)用哪一個(gè)方法還是兩者都調(diào)用與具體服務(wù)器的類型有關(guān); 4. 服務(wù)器和客戶機(jī)根據(jù)雙方都承認(rèn)的協(xié)議進(jìn)行交互,直到關(guān)閉連接時(shí)為止; 5. 服務(wù)器、客戶機(jī)或兩者均關(guān)閉連接; 6. 服務(wù)器返回步驟 2,等待下一個(gè)連接到來。如果在4步花費(fèi)的時(shí)間很長(zhǎng)或時(shí)間無限期,則wu-ftpd這樣的傳統(tǒng)Unix服務(wù)器會(huì)創(chuàng)建一個(gè)新的進(jìn)程來處理每個(gè)連接,從而使服務(wù)器在同一時(shí)刻可以為多個(gè)客戶機(jī)提供服務(wù)。 4 WEB服務(wù)器的設(shè)計(jì)與實(shí)

29、現(xiàn)4.1 Web服務(wù)器的程序設(shè)計(jì)流程根據(jù)上述HTTP協(xié)議的作用原理,實(shí)現(xiàn)GET請(qǐng)求的Web服務(wù)器程序的方法如下: (1) 創(chuàng)建ServerSocket類對(duì)象,監(jiān)聽端口8080。這是為了區(qū)別于HTTP的標(biāo)準(zhǔn)TCP/IP端口80而取的; (2) 等待、接受客戶機(jī)連接到端口8080,得到與客戶機(jī)連接的socket; (3) 創(chuàng)建與socket字相關(guān)聯(lián)的輸入流instream和輸出流outstream; (4) 從與socket關(guān)聯(lián)的輸入流instream中讀取一行客戶機(jī)提交的請(qǐng)求信息,請(qǐng)求信息的格式為:GET 路徑/文件名 HTTP/1.0 (5) 從請(qǐng)求信息中獲取請(qǐng)求類型。如果請(qǐng)求類型是GET,則

30、從請(qǐng)求信息中獲取所訪問的HTML文件名。沒有HTML文件名時(shí),則以index.html作為文件名; (6) 如果HTML文件存在,則打開HTML文件,把HTTP頭信息和HTML文件內(nèi)容通過socket傳回給Web瀏覽器,然后關(guān)閉文件。否則發(fā)送錯(cuò)誤信息給Web瀏覽器; (7) 關(guān)閉與相應(yīng)Web瀏覽器連接的socket字。 可以總結(jié)出Web服務(wù)器的設(shè)計(jì)流程并作出其設(shè)計(jì)流程圖,如圖4-1所示。圖4-1 Web服務(wù)器的程序設(shè)計(jì)流程4.2 用Java實(shí)現(xiàn)Web服務(wù)器的主要設(shè)計(jì)步驟及程序1.點(diǎn)擊開始,打開eclipse軟件,在左框內(nèi)建立Java工程,在工程中分別建立相應(yīng)的包和類,如圖4-2所示。圖4-2在

31、工程中分別建立相應(yīng)的包和類2. 設(shè)計(jì)主函數(shù)程序在Java工程中建立包webserver和類HttpServer、Request、Response,在對(duì)應(yīng)框中輸入以下程序代碼:-HttpServer.java-package webserver;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.Properties;import java.io.IOException;import java.util.Enumeration;import .Ser

32、verSocket;import .Socket;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintStream;public class HttpServer private int iPort = 8080; /default port public static String Basic_Root=System.getProperty(user.dir); public static String WEB_ROOT = System.getProperty(user.dir) + File

33、.separator + webroot; public static int count=0; public HttpServer() System.out.println(歡迎使用Web服務(wù)器,本服務(wù)器只支持靜態(tài)網(wǎng)頁。); System.out.println(檢查配置文件及網(wǎng)頁文件夾.); getConfig(); start(); public static void main(String args) HttpServer httpserver = new HttpServer(); private void getConfig() File fileCon=new File(Bas

34、ic_Root,config.ini); File fileDir=new File(WEB_ROOT); File fileWeb=new File(WEB_ROOT,index.htm); if(!fileCon.exists() System.out.println(配置文件Config.ini損壞,重建中.); reBuildConfig(fileCon); if (!fileDir.exists() System.out.println(網(wǎng)頁存放文件夾不存在,重建中.); fileDir.mkdir(); System.out.print(完成!請(qǐng)?jiān)?; System.out.pri

35、ntln(WEB_ROOT+中放置網(wǎng)頁文件.); System.out.println(Web服務(wù)器將重新初始化.); getConfig(); if (!fileWeb.exists() reBuildWeb(fileWeb); Properties pps = new Properties(); try pps.load(new FileInputStream(config.ini); Enumeration enumer = pertyNames(); String strKey = (String) enumer.nextElement(); String strValu

36、e = pps.getProperty(strKey); if (strValue.equals() != true) WEB_ROOT = strValue; System.out.println(網(wǎng)頁文件的存放路徑為: +WEB_ROOT); strKey = (String) enumer.nextElement(); strValue = pps.getProperty(strKey); if (strValue.equals() != true) iPort = Integer.parseInt(strValue); System.out.println(Web服務(wù)器訪問端口為:+i

37、Port); System.out.println(您可以修改Config.ini文件重新設(shè)定以上配置); System.out.println(啟動(dòng)檢查完成,服務(wù)器初始化中.); catch (IOException ex) ex.printStackTrace(); public void start() System.out.println(Web 服務(wù)器啟動(dòng)中.); ServerSocket serverSocket; try serverSocket = new ServerSocket(iPort); System.out.println(Web 啟動(dòng)完成!); System.ou

38、t.println(您現(xiàn)在可以在瀏覽器中訪問http:/localhost:8080/,以測(cè)試服務(wù)器是否運(yùn)行); while (true) Socket socket = null; InputStream input = null; OutputStream output = null; System.out.println(等待連接.); socket = serverSocket.accept(); System.out.println(socket.getInetAddress().toString()+請(qǐng)求連接); input=socket.getInputStream(); out

39、put=socket.getOutputStream(); System.out.println(服務(wù)器開始處理第+(+count)+次連接); /開始處理并分析請(qǐng)求信息 Request request=new Request(input); request.parse(); /開始發(fā)送請(qǐng)求資源 Response response=new Response(output); response.setRequest(request); response.sendStaticResource(); /關(guān)系連接 socket.close(); System.out.println(連接已關(guān)閉!);

40、catch(Exception ex) ex.printStackTrace(); System.out.println(3); /continue; private void reBuildConfig(File file) try file.createNewFile(); FileOutputStream fos=new FileOutputStream(file); PrintStream sp=new PrintStream(fos); sp.println(WEB_ROOT=); sp.println(PORT=); sp.close(); System.out.println(配

41、置文件Config.ini創(chuàng)建成功,您可以修改WEB_ROOT的值改變網(wǎng)頁文件的存放路徑,修改PORT的值改變?cè)L問端口!); catch (IOException ex) ex.printStackTrace(); System.out.println(重建配置文件Config.ini失敗); System.out.println(服務(wù)器將使用默認(rèn)配置.); private void reBuildWeb(File file) try file.createNewFile(); FileOutputStream fos=new FileOutputStream(file); PrintStre

42、am sp=new PrintStream(fos); sp.println(); sp.println(); sp.println(簡(jiǎn)單Web服務(wù)器); sp.println(); sp.println(); sp.println(服務(wù)器已經(jīng)成功運(yùn)行 ); sp.println(); sp.println(); sp.close(); catch (Exception ex) ex.printStackTrace(); -Request.java-package webserver;import java.io.InputStream;public class Request public

43、Request() private InputStream input; private String uri; public Request(InputStream input) this.input = input; public void parse()/取得請(qǐng)求信息 StringBuffer request = new StringBuffer(2048); int i; byte buffer = new byte2048; try i = input.read(buffer); catch (Exception ex) ex.printStackTrace(); i = -1; f

44、or (int j = 0; j index1) return requestString.substring(index1 + 1, index2); return null; public String getUri() if (pareTo(/)=0) uri=/index.htm; if (uri.indexOf(.)=-1) uri+=.htm; return uri; -Response.java-package webserver;import java.io.OutputStream;import java.io.IOException;import java.io.FileI

45、nputStream;import java.io.File;public class Response private static final int BUFFER_SIZE = 1024; Request request; OutputStream output; public Response(OutputStream output) this.output = output; public void setRequest(Request request) this.request = request; public void sendStaticResource()/發(fā)送請(qǐng)求資源 throws IOException byte bytes = new byteBUFFER_SIZE; FileInputStream fis = null; try File file = new File(HttpServer.WEB_ROOT, request

溫馨提示

  • 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論