




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、簡(jiǎn)單Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)摘 要 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)鍵詞 計(jì)算模型;Java;HTTP;Web服務(wù)器1 前言Internet是目前世界上最大的計(jì)算機(jī)互聯(lián)網(wǎng)絡(luò),與大家的生
2、活、學(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)備工作所解決的問題。(1)Java簡(jiǎn)介Java
3、是由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頁面2。 (2)HTTP協(xié)議簡(jiǎn)介HTTP 協(xié)
4、議是應(yīng)用層的協(xié)議,定義了服務(wù)器端和客戶端之間文件傳輸?shù)臏贤ǚ绞?。HTTP協(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命令獲得一個(gè)簡(jiǎn)單的HTML文件;(4)運(yùn)行該
5、服務(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ì)算模型,由Web 瀏覽器(客戶機(jī))和Web服務(wù)器(服務(wù)
6、器)構(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)答。 wsHTTP協(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ù)的傳遞)。GET命令的格式為: GET 路徑/
7、文件名 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。如果找到該文件,Web服務(wù)器把該文件內(nèi)容傳送給相應(yīng)的Web瀏覽
8、器。 為了告知 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ò)編程。 java中的多線程及實(shí)現(xiàn):Java是面向?qū)ο蟮某绦蛘Z言,用Java進(jìn)行程序設(shè)計(jì)就是設(shè)計(jì)和使用類,Java為我們提供了線程類Thread來創(chuàng)建線程,創(chuàng)建線程與創(chuàng)建普通的類的對(duì)象的操作是一樣的,而線程就是Thread類
9、或其子類的實(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()方法: 通過定義一個(gè)Thread類的子類,在該子類中重寫
10、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)行的線程位于該狀態(tài),有以下幾種情況: a.處于New狀態(tài)的線程執(zhí)行sta
11、rt()。 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)Dead:死亡狀態(tài)線程運(yùn)行結(jié)束,對(duì)于主線程main()結(jié)束
12、,對(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)。阻塞解除條件為其它線程調(diào)用該資源的notify()或not
13、ifyAll()。下面一個(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() System.out.println(Thread2 is
14、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(); file:/strat()方法啟動(dòng)線程; 運(yùn)行該程序就可以看出,線
15、程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ù)操作。 IO字節(jié)流操作1)Java中使用流的方式處理數(shù)據(jù),基
16、本的處理類為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é),存放在byte中從第一個(gè)int參數(shù)開始(索引),最大長(zhǎng)度為第二個(gè)int
17、參數(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)制數(shù)據(jù)時(shí)會(huì)存在編碼問題,一般不使用字符流操作二進(jìn)制數(shù)據(jù)。InputSt
18、reamReader:將字節(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)字符集(取決于JVM)將OutputStreamWriter轉(zhuǎn)為OutputStr
19、eam。OutputStreamWriter(OutputStream, String):使用String指定的字符集將OutputStreamWriter轉(zhuǎn)為OutputStream。BufferedReader:提供緩沖;readLine()。BufferedWriter:提供緩沖。PrintWriter:提供緩沖;print()、println()等方法。注意:在開發(fā)中,一般使用BufferedReader和PrintWriter結(jié)合使用完成對(duì)字符流的過濾。 網(wǎng)絡(luò)架構(gòu):1)C/S網(wǎng)絡(luò)架構(gòu)客戶端/服務(wù)器架構(gòu),通常情況下,數(shù)據(jù)存儲(chǔ)在服務(wù)器端,客戶端和服務(wù)器端都有一個(gè)獨(dú)立的應(yīng)用程序,可以進(jìn)行獨(dú)
20、立的操作,通過網(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:支持多種加密操作的超文本傳輸協(xié)議。優(yōu)點(diǎn):客戶端不需要安裝任何附加軟件,同時(shí)整個(gè)應(yīng)用
21、的升級(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.DatagramSocket類:服務(wù)器端和客戶端使用,用于實(shí)現(xiàn)通信的基本功能。b.Dat
22、agramPacket類:服務(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),這是一種基于Java的窗口組件,類似Java本身提供的AWT和Swing窗口組
23、件,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)的用戶一致的感官效果5。3.2 Web服務(wù)器的套接字編程Java提供了一個(gè) S
24、erverSocket類,程序員可以很方便地用它編寫服務(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ù)總是通過固有的套接字傳遞。 ServerSocket類 ServerSocket類包含了用 Java編寫服務(wù)器程序的
25、所有內(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í) accept()方法返回連接客戶機(jī)何服務(wù)器的 Socket; 3. 調(diào)用 getInput
26、Stream()方法、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ù)。 構(gòu)造器 一共有3個(gè)公共ServerSocket構(gòu)造器: public ServerSocket(int port
27、) throws IOException, BindException public ServerSocket(int port, int queueLength) throws IOException, BindException public ServerSocket(int port, int queueLength, InetAddress bindaddress) throws IOException這些構(gòu)造器允許用戶指定端口、用于保存到來的連接請(qǐng)求隊(duì)列的長(zhǎng)度以及綁定本地網(wǎng)絡(luò)的接口。它們的基本功能完全相同,但其中有一些使用默認(rèn)的隊(duì)列長(zhǎng)度值和默認(rèn)的綁定地址。4 WEB服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)
28、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,則從
29、請(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)的包和類,如圖3-2所示。圖4-2在工
30、程中分別建立相應(yīng)的包和類2. 設(shè)計(jì)主函數(shù)程序在Java工程中建立包main和類WebServerMain,在對(duì)應(yīng)框中輸入以下程序:package com.web.main;import com.web.gui.WebServerFrame;public class WebServerMain /接口的實(shí)現(xiàn)public static void main(String args) new WebServerFrame();3.設(shè)計(jì)Web服務(wù)器的圖形界面在Java工程中建立包gui和類WebServerFrame,在對(duì)應(yīng)框中輸入以下程序:package com.web.gui;import java
31、.awt.*;import java.awt.event.*;import javax.swing.*;import .WebServerNet;public class WebServerFrame extends JFrame implements ActionListener private JMenuBar menuBar = new WebServerJMenuBar(this);/ 按鈕面板Private JPanel btnPan = new JPanel(new FlowLayout(FlowLayout.CENTER); /將按鈕面板選擇布局管理器進(jìn)行布局管理構(gòu)建北部面板pr
32、ivate JLabel listenPortLb = new JLabel(服務(wù)器監(jiān)聽端口: );/private JTextField portTf = new JTextField(1111, 5);/寬度設(shè)置為5private JButton controlBtn = new JButton(開始);/設(shè)置按鈕名稱private JButton clearHintBtn = new JButton(清空);/ 提示信息面板private JTextArea hintTa = new JTextArea();private WebServerNet net;public WebServe
33、rFrame() initComponent();net = new WebServerNet(this);/初始化所有界面組件private void initComponent() setJMenuBar(menuBar);buildBtnPan();buildHintPan();/建立按鍵setSize(400, 300);/設(shè)置按鍵大小Toolkit tool = Toolkit.getDefaultToolkit();setLocation(tool.getScreenSize().width - this.getSize().width) / 2,(tool.getScreenSi
34、ze().height - this.getSize().height) / 2); this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent arg0) WebServerFrame.this.setVisible(true);WebServerFrame.this.dispose(););/設(shè)置容器的大小setTitle(IIS Web服務(wù)器 V01);/命名服務(wù)器的名字setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);/構(gòu)建
35、按鈕面板public void buildBtnPan() btnPan.add(listenPortLb);btnPan.add(portTf);btnPan.add(controlBtn);btnPan.add(clearHintBtn);/加入所有按鍵add(btnPan, BorderLayout.NORTH);/將按鍵放置在北部面板portTf.requestFocus();portTf.selectAll();controlBtn.addActionListener(this);clearHintBtn.addActionListener(this);/構(gòu)建信息面板public v
36、oid buildHintPan() hintTa.setEditable(false);JScrollPane scrollPane = new JScrollPane();scrollPane.setBorder(BorderFactory.createLoweredBevelBorder();scrollPane.getViewport().add(hintTa);add(scrollPane, BorderLayout.CENTER);/將構(gòu)建內(nèi)容面板放置在容器的中間 hintTa.setText(請(qǐng)按“開始”按鈕來開啟Web服務(wù)器。); /各個(gè)出現(xiàn)的問題監(jiān)測(cè)public void a
37、ctionPerformed(ActionEvent arg0) Object source = arg0.getSource();/判斷按鈕提示文字內(nèi)容if (source = clearHintBtn) hintTa.setText();return;String msg = controlBtn.getText();if (msg.equals(開始) controlBtn.setText(停止);portTf.setEditable(false);net.start(portTf.getText(); else controlBtn.setText(開始);portTf.setEdit
38、able(true);net.stop();public void addHint(String s) hintTa.setText(hintTa.getText() + rn + s);5 測(cè)試運(yùn)行5.1 調(diào)試運(yùn)行 為了確保上述程序的正確性,進(jìn)行調(diào)試運(yùn)行,在工程中建立Folder,并在其內(nèi)建立html文件,如圖5-1所示。圖5-1 添加html文件在index.html文件中輸入“大家好,我是來自通信0702班的丁弟。我的課程設(shè)計(jì)是簡(jiǎn)單的WEB服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn),我所用的語言是JAVA。 謝謝大家。”如下圖5-2所示。圖5-2在index.html文件中輸入如圖字樣 接著點(diǎn)擊Web服務(wù)器中的
39、“開始”,開啟Web服務(wù)器結(jié)果顯示為如圖5-3所示。圖5-3 點(diǎn)擊Web服務(wù)器中的“開始” 然后打開瀏覽器,輸入網(wǎng)址http:/:1111/index.html,即 Web服務(wù)器把該文件內(nèi)容傳送給了相應(yīng)的Web瀏覽器。刷新得到如圖5-4所示:圖5-4 把文件內(nèi)容傳送給相應(yīng)的Web瀏覽器 服務(wù)器窗口顯示內(nèi)容如圖5-5所示: 5-5 運(yùn)行服務(wù)器訪問結(jié)果6 結(jié)束語 隨著網(wǎng)絡(luò)在人們?nèi)粘I钪械膽?yīng)用越來越廣泛和嵌入式技術(shù)在日常生活中的地位日愈凸顯。這對(duì)我們這些有關(guān)網(wǎng)絡(luò)專業(yè)的學(xué)生既是一種挑戰(zhàn),也是一個(gè)機(jī)遇。通過這次課程設(shè)計(jì)讓我初步了解了Web服務(wù)器的設(shè)計(jì)和工作原理,掌握了一些JAVA語言和學(xué)會(huì)使用Ecli
40、pse編程軟件,對(duì)我的網(wǎng)絡(luò)編程有了很大的提高。與此同時(shí)我還學(xué)到了一些專業(yè)知識(shí)之外的東西。課程設(shè)計(jì)的過程中,我了解到課程設(shè)計(jì)不光光是埋頭做設(shè)計(jì),也是同學(xué)之間互相學(xué)習(xí),互相交流經(jīng)驗(yàn)的機(jī)會(huì);也是大家向老師提出疑問和解答疑問的機(jī)會(huì)。我覺得課程設(shè)計(jì)是一個(gè)復(fù)習(xí)課堂上學(xué)到知識(shí)的機(jī)會(huì),也是一個(gè)加強(qiáng)學(xué)生動(dòng)手設(shè)計(jì)能力的機(jī)會(huì)。設(shè)計(jì)起初我遇到了一些問題,后來我通過上網(wǎng),查閱書籍和請(qǐng)教老師,對(duì)一些問題有了初步了解。當(dāng)然在老師和同學(xué)的熱心幫助下,我慢慢解開了課程設(shè)計(jì)中遇到的一些問題,慢慢揭開這門設(shè)計(jì)的神秘面紗,最終完成了我的課程設(shè)計(jì)。這次課程設(shè)計(jì)不僅考察了我們對(duì)課堂學(xué)的專業(yè)知識(shí)的理解程度,也鍛煉了我們的動(dòng)手能力,提高了我
41、們獨(dú)立思考問題,解決問題的能力。總體上看,我覺得這次課程設(shè)計(jì)使我自身的知識(shí)豐富了不少,但是同時(shí)也發(fā)現(xiàn)了自己在動(dòng)手和專業(yè)知識(shí)方面存在的一些問題,例如知識(shí)不能融合,不能與實(shí)踐相結(jié)合,軟件操作不夠熟練,不能靈活運(yùn)用。使我了解要先學(xué)好理論知識(shí)才能很好的與實(shí)踐相結(jié)合,才能熟練的運(yùn)用到生活中。參考文獻(xiàn)1 Harvey M.Deitel等著邱仲潘等 譯.Java Web服務(wù)高級(jí)教程 .第一版.機(jī)械工業(yè)出版社,2003.72孫衛(wèi)琴. Java網(wǎng)絡(luò)編程精解. 北京:電子工業(yè)出版社,2007.33劉賀湘Internet實(shí)用技術(shù)教程北京:清華大學(xué)出版社,19984吳鳳祥.用Java實(shí)現(xiàn)一個(gè)Socket通信模型.現(xiàn)代
42、電子技術(shù),2001.7.20,155 耿祥義、張躍平.Java2實(shí)用教程(第三版).清華大學(xué)出版社.2006 附錄1:基于Java 的簡(jiǎn)單Web服務(wù)器的程序設(shè)計(jì)與實(shí)現(xiàn)/ 程序名稱:WebServer.java/ 程序功能:簡(jiǎn)單Web服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)/ 程序作者:丁弟/ 最后修改日期:2010-06-30程序1:實(shí)現(xiàn)主函數(shù)程序package com.web.main;import com.web.gui.WebServerFrame;public class WebServerMain /接口的實(shí)現(xiàn)public static void main(String args) new WebServe
43、rFrame();程序2:實(shí)現(xiàn)Web服務(wù)器的圖形界面package com.web.gui;import java.awt.*;import java.awt.event.*;import javax.swing.*;import net.WebServerNet;public class WebServerFrame extends JFrame implements ActionListener private JMenuBar menuBar = new WebServerJMenuBar(this);/ 按鈕面板Private JPanel btnPan = new JPanel(ne
44、w FlowLayout(FlowLayout.CENTER); /將按鈕面板選擇布局管理器進(jìn)行布局管理構(gòu)建北部面板private JLabel listenPortLb = new JLabel(服務(wù)器監(jiān)聽端口: );/private JTextField portTf = new JTextField(1111, 5);/寬度設(shè)置為5private JButton controlBtn = new JButton(開始);/設(shè)置按鈕名稱private JButton clearHintBtn = new JButton(清空);/ 提示信息面板private JTextArea hintT
45、a = new JTextArea();private WebServerNet net;public WebServerFrame() initComponent();net = new WebServerNet(this);/初始化所有界面組件private void initComponent() setJMenuBar(menuBar);buildBtnPan();buildHintPan();/建立按鍵setSize(400, 300);/設(shè)置按鍵大小Toolkit tool = Toolkit.getDefaultToolkit();setLocation(tool.getScre
46、enSize().width - this.getSize().width) / 2,(tool.getScreenSize().height - this.getSize().height) / 2); this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent arg0) WebServerFrame.this.setVisible(true);WebServerFrame.this.dispose(););/設(shè)置容器的大小setTitle(IIS Web服務(wù)器 V01);/命名服務(wù)器的名字
47、setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);/構(gòu)建按鈕面板public void buildBtnPan() btnPan.add(listenPortLb);btnPan.add(portTf);btnPan.add(controlBtn);btnPan.add(clearHintBtn);/加入所有按鍵add(btnPan, BorderLayout.NORTH);/將按鍵放置在北部面板portTf.requestFocus();portTf.selectAll();controlBtn.addActionListene
48、r(this);clearHintBtn.addActionListener(this);/構(gòu)建信息面板public void buildHintPan() hintTa.setEditable(false);JScrollPane scrollPane = new JScrollPane();scrollPane.setBorder(BorderFactory.createLoweredBevelBorder();scrollPane.getViewport().add(hintTa);add(scrollPane, BorderLayout.CENTER);/將構(gòu)建內(nèi)容面板放置在容器的中間
49、 hintTa.setText(請(qǐng)按“開始”按鈕來開啟Web服務(wù)器。); /各個(gè)出現(xiàn)的問題監(jiān)測(cè)public void actionPerformed(ActionEvent arg0) Object source = arg0.getSource();/判斷按鈕提示文字內(nèi)容if (source = clearHintBtn) hintTa.setText();return;String msg = controlBtn.getText();if (msg.equals(開始) controlBtn.setText(停止);portTf.setEditable(false);net.start(
50、portTf.getText(); else controlBtn.setText(開始);portTf.setEditable(true);net.stop();public void addHint(String s) hintTa.setText(hintTa.getText() + rn + s);程序3:建立菜單欄package com.web.gui;import java.awt.*;import java.awt.event.*;import java.io.*;import .*;import javax.swing.*;public class WebServerJMenu
51、Bar extends JMenuBar implements ActionListener/文件菜單private JMenu fileMenu=new JMenu(文件);private JMenuItem newWindowMi=new JMenuItem(新建, KeyEvent.VK_N);private JMenuItem openFileMi=new JMenuItem(打開文件, KeyEvent.VK_O);private JMenuItem pageSaveAsMi=new JMenuItem(另存為., KeyEvent.VK_S);private JMenuItem e
52、xitMi=new JMenuItem(退出, KeyEvent.VK_E);/編輯菜單private JMenu editMenu=new JMenu(編輯);private JMenuItem copyMi=new JMenuItem(復(fù)制, KeyEvent.VK_C);private JMenuItem pasteMi=new JMenuItem(粘貼, KeyEvent.VK_P);/查看菜單private JMenu viewMenu=new JMenu(查看);private JMenuItem backMi=new JMenuItem(后退, KeyEvent.VK_B);pr
53、ivate JMenuItem forwardMi=new JMenuItem(向前, KeyEvent.VK_F);/幫助菜單private JMenu helpMenu=new JMenu(幫助);private JMenuItem aboutMi=new JMenuItem(關(guān)于版本, KeyEvent.VK_A);private WebServerFrame frame=null;public WebServerJMenuBar(WebServerFrame frame) this.frame=frame;initComponent();private void initComponent() /構(gòu)建文件菜單fileMenu.setMnemonic(KeyEvent.VK_F);fileMenu.add(newWi
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025【廣告位承包租賃合同書】房屋租賃合同范本
- 2025企業(yè)租賃合同范例
- 2025網(wǎng)絡(luò)安全保險(xiǎn)合同書
- 2025存量房買賣合同示范文本(版)
- 2025年墻壁粉刷工程施工合同
- 安徽省滁州市2024-2025學(xué)年高二下學(xué)期期中英語試題(含答案)
- 環(huán)保招租廠房合同協(xié)議
- 環(huán)保閥門采購合同協(xié)議
- 生存物資采購合同協(xié)議
- 電力遷改施工合同協(xié)議
- 提升質(zhì)量意識(shí)-強(qiáng)化質(zhì)量管理
- 大眾傳媒文化智慧樹知到期末考試答案章節(jié)答案2024年復(fù)旦大學(xué)
- 2024年《網(wǎng)絡(luò)反不正當(dāng)競(jìng)爭(zhēng)暫行規(guī)定》重點(diǎn)解讀
- NB-T20048-2011核電廠建設(shè)項(xiàng)目經(jīng)濟(jì)評(píng)價(jià)方法
- 河南省信陽市固始縣2023-2024學(xué)年四年級(jí)下學(xué)期期末數(shù)學(xué)試題
- 修補(bǔ)外墻防水合同
- 20萬噸有機(jī)肥項(xiàng)目可行性研究報(bào)告
- 合作社用地租賃合同樣本
- 2024-2030年中國(guó)街舞培訓(xùn)行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及競(jìng)爭(zhēng)格局與投資戰(zhàn)略研究報(bào)告
- 大學(xué)寫作訓(xùn)練(第四版)課件 第15章 微型小說
- 顱內(nèi)感染的護(hù)理查房
評(píng)論
0/150
提交評(píng)論