




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、簡單Web服務器設計與實現(xiàn)摘 要 WWW的工作基于客戶機/服務器計算模型,由Web 瀏覽器(客戶機)和Web服務器(服務器)構成,兩者之間采用超文本傳送協(xié)議(HTTP)進行通信,HTTP協(xié)議的作用原理包括四個步驟:連接,請求,應答,關閉應答。在課程設計中,系統(tǒng)開發(fā)平臺為Win7,程序設計語言采用Java,程序運行平臺為Eclipse。在程序設計中,采用了結構化與面向對象兩種解決問題的方法。程序通過調試運行,初步實現(xiàn)了設計目標,并且經過適當完善后,將可以應用在商業(yè)中解決實際問題。關鍵詞 計算模型;Java;HTTP;Web服務器1 前言Internet是目前世界上最大的計算機互聯(lián)網絡,與大家的生
2、活、學習、工作有著越來越密切的關系,它遍布全球,將世界各地各種規(guī)模的網絡連接成一個整體,其用戶群十分龐大,因此,建設一個好的Web站點對于一個機構的發(fā)展十分重要。近年來,隨著網絡用戶要求的不斷提高及計算機科學的迅速發(fā)展,特別是數(shù)據庫技術在Internet中的廣泛應用,Web站點向用戶提供的服務將越來越豐富,越來越人性化。本課程設計主要解決由Web 瀏覽器(客戶機)和Web服務器(服務器)構成,兩者之間采用超文本傳送協(xié)議(HTTP)進行通信的Web服務器的程序設計。1.1 課程設計前準備以下的工作均是建立在大量的調查基礎上的,是Web服務器開發(fā)前期準備工作所解決的問題。(1)Java簡介Java
3、是由sun公司開發(fā)的一種新型的面向對象的程序設計語言,主要用于web頁面的設計1。Java語言的流行除了因為它能夠編制嵌入HTML文件中的Applet外,還在于Java語言本身的面向對象、簡單、平臺無關性、安全性、多線程等特點。Java語言的發(fā)展頗具傳奇性,它與Internet的WWW的迅猛發(fā)展是分不開的。由于其發(fā)展迅速,有人將它比喻為Internet上的世界語。前面講到在Internet上Web頁面的設計采用的是HTML語言,用戶借助于Web瀏覽器(如Netscape,HotJava,IE等),可以訪問到遠程web服務器上靜態(tài)的、具有超鏈接的Web頁面2。 (2)HTTP協(xié)議簡介HTTP 協(xié)
4、議是應用層的協(xié)議,定義了服務器端和客戶端之間文件傳輸?shù)臏贤ǚ绞?。HTTP協(xié)議用于從WWW服務器傳輸超文本到本地瀏覽器的傳送協(xié)議。由于HTTP協(xié)議支持的服務不限于WWW,還可以是其它服務,它允許用戶在統(tǒng)一的界面下,采用不同的協(xié)議訪問不同的服務。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示等3。1.2 課程設計的內容(1)熟悉WWW服務器和WEB服務器的工作原理;(2)熟悉套接字編程的相關知識;(3)完成一個簡單的WEB服務器的設計與實現(xiàn),要求能夠通過HTTP GET命令獲得一個簡單的HTML文件;(4)運行該
5、服務器,并編寫一個簡單的HTML文件完成測試。1.3 課程設計要求(1)按要求編寫課程設計報告書,能正確闡述設計結果。(2)通過課程設計培養(yǎng)學生嚴謹?shù)目茖W態(tài)度,認真的工作作風和團隊協(xié)作。(3)學會文獻檢索的基本方法和綜合運用文獻的能力。(4)在老師的指導下,要求每個學生獨立完成課程設計的全部內容。1.4 課程設計平臺 Windows7系統(tǒng);Eclipse軟件平臺2 Web服務器的工作原理2.1 HTTP協(xié)議的作用原理WWW是以Internet作為傳輸媒介的一個應用系統(tǒng),WWW網上最基本的傳輸單位是Web網頁。WWW的工作基于客戶機/服務器計算模型,由Web 瀏覽器(客戶機)和Web服務器(服務
6、器)構成,兩者之間采用超文本傳送協(xié)議(HTTP)進行通信。HTTP協(xié)議是基于TCP/IP協(xié)議之上的協(xié)議,是Web瀏覽器和Web服務器之間的應用層協(xié)議,是通用的、無狀態(tài)的、面向對象的協(xié)議。HTTP協(xié)議的作用原理包括四個步驟:連接,請求,應答,關閉應答。 wsHTTP協(xié)議的作用原理包括四個步驟: (1)連接:Web瀏覽器與Web服務器建立連接,打開一個稱為socket(套接字)的虛擬文件,此文件的建立標志著連接建立成功。 (2) 請求:Web瀏覽器通過socket向Web服務器提交請求。HTTP的請求一般是GET或POST命令(POST用于FORM參數(shù)的傳遞)。GET命令的格式為: GET 路徑/
7、文件名 HTTP/1.0 文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。 (3) 應答:Web瀏覽器提交請求后,通過HTTP協(xié)議傳送給Web服務器。Web服務器接到后,進行事務處理,處理結果又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請求的頁面。 例:假設客戶機與:8080/mydir/index.html建立了連接,就會發(fā)送GET命令:GET /mydir/index.html HTTP/1.0。主機名為 的Web服務器從它的文檔空間中搜索子目錄mydir的文件index.html。如果找到該文件,Web服務器把該文件內容傳送給相應的Web瀏覽
8、器。 為了告知 Web瀏覽器傳送內容的類型,Web服務器首先傳送一些HTTP頭信息,然后傳送具體內容(即HTTP體信息),HTTP頭信息和HTTP體信息之間用一個空行分開。 (4) 關閉連接:當應答結束后,Web瀏覽器與Web服務器必須斷開,以保證其它Web瀏覽器能夠與Web服務器建立連接。 2.2 Java開發(fā)語言相關知識與技術Java主要技術有:多線程,I/O流操作,網絡編程。 java中的多線程及實現(xiàn):Java是面向對象的程序語言,用Java進行程序設計就是設計和使用類,Java為我們提供了線程類Thread來創(chuàng)建線程,創(chuàng)建線程與創(chuàng)建普通的類的對象的操作是一樣的,而線程就是Thread類
9、或其子類的實例對象。下面是一個創(chuàng)建啟動一個線程的語句: Thread thread1=new Thread(); file:/聲明一個對象實例,即創(chuàng)建一個線程; Thread1.run(); file:/用Thread類中的run()方法啟動線程; 從這個例子,我們可以通過Thread()構造方法創(chuàng)建一個線程,并啟動該線程。事實上,啟動線程,也就是啟動線程的run()方法,而Thread類中的run()方法沒有任何操作語句,所以這個線程沒有任何操作。要使線程實現(xiàn)預定功能,必須定義自己的run()方法。Java中通常有兩種方式定義run()方法: 通過定義一個Thread類的子類,在該子類中重寫
10、run()方法。Thread子類的實例對象就是一個線程,顯然,該線程有我們自己設計的線程體run()方法,啟動線程就啟動了子類中重寫的run()方法。 通過Runnable接口,在該接口中定義run()方法的接口。所謂接口跟類非常類似,主要用來實現(xiàn)特殊功能,如復雜關系的多重繼承功能。線程被實際創(chuàng)建后處于待命狀態(tài),激活(啟動)線程就是啟動線程的run()方法,這是通過調用線程的start()方法來實現(xiàn)的。 線程狀態(tài):1)New當線程對象被創(chuàng)建時,處于該狀態(tài)。 2)Runnable:就緒狀態(tài),線程滿足運行的所有條件但沒有正在運行的線程位于該狀態(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:運行狀態(tài)處于運行狀態(tài)的線程可能發(fā)生以下幾種情況: a.線程運行結束,進入Dead狀態(tài)。 b.CPU被分配給其它線程,進入Runnable狀態(tài)。 c.滿足Otherwise Block的條件,進入Otherwise Block狀態(tài)。 d.由于鎖的原因無法執(zhí)行,進入Lock Block狀態(tài)。 e.由于等待的原因無法執(zhí)行,進入Wait Block狀態(tài)。 4)Dead:死亡狀態(tài)線程運行結束,對于主線程main()結束
12、,對于普通用戶線程run()結束。 5)Otherwise Block:阻塞狀態(tài),阻塞解除后進入Runnable狀態(tài) a.調用sleep(),阻塞解除條件為阻塞時間滿。 b.調用join(),阻塞解除條件為調用join()的線程執(zhí)行結束。注意:線程進入該狀態(tài)不會釋放鎖。 6)Lock Block:鎖阻塞狀態(tài),阻塞解除后進入Runnable狀態(tài)由于無法獲得需要的鎖而阻塞地線程進入該狀態(tài),阻塞解除條件為獲得所需的鎖。 7)Wait Block:等待阻塞狀態(tài),阻塞解除后進入Lock Block狀態(tài)由于某個資源的原因必須進行等待,則進入該狀態(tài)。阻塞解除條件為其它線程調用該資源的notify()或not
13、ifyAll()。下面一個例子實踐了如何通過上述兩種方法創(chuàng)建線程并啟動它們: / 通過Thread類的子類創(chuàng)建的線程; class thread1 extends Thread file:/自定義線程的run()方法; public void run() System.out.println(Thread1 is running); file:/通過Runnable接口創(chuàng)建的另外一個線程; 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接口類的對象創(chuàng)建線程; threadone.start(); threadtwo.start(); file:/strat()方法啟動線程; 運行該程序就可以看出,線
15、程threadone和threadtwo交替占用CPU,處于并行運行狀態(tài)??梢钥闯觯瑔泳€程的run()方法是通過調用線程的start()方法來實現(xiàn)的(見上例中主類),調用start()方法啟動線程的run()方法不同于一般的調用方法,調用一般方法時,必須等到一般方法執(zhí)行完畢才能夠返回start()方法,而啟動線程的run()方法后,start()告訴系統(tǒng)該線程準備就緒可以啟動run()方法后,就返回start()方法執(zhí)行調用start()方法語句下面的語句,這時run()方法可能還在運行,這樣,線程的啟動和運行并行進行,實現(xiàn)了多任務操作。 IO字節(jié)流操作1)Java中使用流的方式處理數(shù)據,基
16、本的處理類為InputStream(字節(jié)讀入流)和OutputStream(字節(jié)輸出流)。2)可以使用各種過濾流對流數(shù)據進行過濾,實現(xiàn)各種附加功能。3)對字節(jié)流進行轉換和包裝可以獲得字符流,字符流的基本處理流為Reader(字符讀入流)和Writer(字符輸出流)。a.字節(jié)流:InputStream:int read()讀入流中的一個字節(jié)并返回,數(shù)據存放在int的低8位中;int read(byte)讀入流中的若干個字節(jié),存放在byte中,返回讀入字節(jié)的數(shù)量;int read(byte,int,int)讀入流中的若干個字節(jié),存放在byte中從第一個int參數(shù)開始(索引),最大長度為第二個int
17、參數(shù)的區(qū)間內。OutputStream:flush()將輸出緩沖區(qū)中的信息寫到真正的輸出設備。調用方法: 輸出緩沖區(qū)滿:自動調用; 調用close()時先調用flush():自動調用; 手動調用flush()最常見的情況是產生異常時,雖然在finally中會對流執(zhí)行close(),但在異常條件下,close()能保證對流的關閉,但在調用flush()時會有漏洞。b.字符流:優(yōu)點:操作文本數(shù)據時比較直觀,讀入和寫出都以char為基本單位。缺點:底層依然以字節(jié)流方式操作,所以在任何情況下都必須有轉換的過程,效率相對較低。操作二進制數(shù)據時會存在編碼問題,一般不使用字符流操作二進制數(shù)據。InputSt
18、reamReader:將字節(jié)讀入流轉為字符讀入流。InputStreamReader(InputStream):使用默認字符集(取決的JVM)將InpustStream轉為InputStreamReader。InputStreamReader(InputStream, String):使用String指定的字符集將InputStream轉為InputStreamReader。OutputStreamWriter:將字符輸出流轉為字節(jié)輸出流。OutputStreamWriter(OutputStream):使用默認字符集(取決于JVM)將OutputStreamWriter轉為OutputStr
19、eam。OutputStreamWriter(OutputStream, String):使用String指定的字符集將OutputStreamWriter轉為OutputStream。BufferedReader:提供緩沖;readLine()。BufferedWriter:提供緩沖。PrintWriter:提供緩沖;print()、println()等方法。注意:在開發(fā)中,一般使用BufferedReader和PrintWriter結合使用完成對字符流的過濾。 網絡架構:1)C/S網絡架構客戶端/服務器架構,通常情況下,數(shù)據存儲在服務器端,客戶端和服務器端都有一個獨立的應用程序,可以進行獨
20、立的操作,通過網絡進行數(shù)據傳輸。常用的傳輸協(xié)議包括:TCP/IP:基于連接的協(xié)議優(yōu)點:由于是有連接的傳輸,對于數(shù)據的準確性是有保證的。缺點:系統(tǒng)資源占用較多。UDP/IP:無連接的協(xié)議(數(shù)據報)優(yōu)點:系統(tǒng)資源占用少。缺點:無法保證傳輸?shù)臏蚀_性。用途:a.對于數(shù)據少量丟失可以接受的應用。b.存在足夠數(shù)據冗余的應用。2)B/S網絡架構瀏覽器/服務器架構,在服務器端完成幾乎所有的功能(包括數(shù)據存儲),客戶端的瀏覽器只完成和服務器交互和顯示服務器傳輸?shù)男畔⒌墓δ堋3S玫膫鬏攨f(xié)議包括:http:超文本傳輸協(xié)議。https:支持多種加密操作的超文本傳輸協(xié)議。優(yōu)點:客戶端不需要安裝任何附加軟件,同時整個應用
21、的升級也相對簡單。IP:通過IP Address和Port(端口)定位具體的應用;Port的有效范圍是065535,通常在開發(fā)應用時應避免使用1000以下的端口,1000以下有很多端口被常用應用占用。IP Address在JDK5.0中支持4位或6位兩種方式,現(xiàn)在4位的占據主導地位,但將來會逐漸過渡到6位IP地址的模式。TCP/IP協(xié)議的實現(xiàn):a.ServerSocket類:服務器端使用,用于監(jiān)聽客戶端的請求。b.Socket類:服務器端和客戶端使用,用于完成具體通信的所有功能。UDP/IP協(xié)議的實現(xiàn):a.DatagramSocket類:服務器端和客戶端使用,用于實現(xiàn)通信的基本功能。b.Dat
22、agramPacket類:服務器端和客戶端使用,用于封裝通信的內容信息。3 開發(fā)環(huán)境及套字接編程3.1 Web服務器的開發(fā)環(huán)境 該課程設計是基于Java編程語言的設計的Web服務器,開發(fā)環(huán)境是Eclipse軟件和Java Swing。(1)Eclipse簡介 Eclipse 是一個開放源代碼的、基于 Java 的可擴展開發(fā)平臺。就其本身而言,它只是一個框架和一組服務,用于通過插件和組件構建開發(fā)環(huán)境。Eclipse 附帶了一個標準的插件集,包括 Java 開發(fā)工具。Eclipse采用的技術是IBM公司開發(fā)的(SWT),這是一種基于Java的窗口組件,類似Java本身提供的AWT和Swing窗口組
23、件,Eclipse的插件機制是輕型軟件組件化架構。在富客戶機平臺上,Eclipse使用插件來提供所有的附加功能4。(2) Java Swing概述 Swing是不對等基于GUI工具箱的正式名字,它是Java基礎類庫的一部分。完整的JFC十分龐大,其中包含的內容遠遠大于Swing GUI工具箱。JFC特性不僅僅包含了Swing組件,而且還包含了一個可訪問的API、一個2D API和一個可拖拽的API。Swing擁有一個豐富、便捷的用戶界面元素集合,對底層平臺依賴的很少,因此與平臺相關的bug很少。Swing給予不同平臺的用戶一致的感官效果5。3.2 Web服務器的套接字編程Java提供了一個 S
24、erverSocket類,程序員可以很方便地用它編寫服務器程序。服務器套接字的基本功能類似于坐在電話機旁邊等待呼叫到來。從技術上講, ServerSocket運行在服務器上并監(jiān)聽到來的 TCP連接。 每個ServerSocket都在服務器上的指定端口監(jiān)聽。當遠程主機上的客戶Socket試圖與指定端口建立連接時,服務器被激活,判定客戶程序與服務器的連接,并打開兩個主機之間固有的Socket。一旦與服務器套接字建立了連接,則服務器就可以使用固有的Socket對象向客戶機發(fā)送數(shù)據。數(shù)據總是通過固有的套接字傳遞。 ServerSocket類 ServerSocket類包含了用 Java編寫服務器程序的
25、所有內容。它包括創(chuàng)建新 ServerSocket對象的構造器、在指定端口監(jiān)聽連接的方法,以及連接建立后可以發(fā)送和接收數(shù)據時返回 Socket對象的方法。此外,它還有設置不同選項以及各種各樣常用的方法,例如 toString()方法。 服務器的基本生命期是: 1. 利用 ServerSocket()構造器在指定端口創(chuàng)建一個新的 ServerSocket; 2. ServerSocket利用它的accept()方法在指定端口監(jiān)聽到來的連接。accept()方法一直處于阻塞狀態(tài),直到有客戶機試圖建立連接。這時 accept()方法返回連接客戶機何服務器的 Socket; 3. 調用 getInput
26、Stream()方法、getOutputStream()方法或者兩者都調用來得到與客戶機通信的輸入流和輸出流,具體調用哪一個方法還是兩者都調用與具體服務器的類型有關; 4. 服務器和客戶機根據雙方都承認的協(xié)議進行交互,直到關閉連接時為止; 5. 服務器、客戶機或兩者均關閉連接; 6. 服務器返回步驟 2,等待下一個連接到來。如果在4步花費的時間很長或時間無限期,則wu-ftpd這樣的傳統(tǒng)Unix服務器會創(chuàng)建一個新的進程來處理每個連接,從而使服務器在同一時刻可以為多個客戶機提供服務。 構造器 一共有3個公共ServerSocket構造器: 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這些構造器允許用戶指定端口、用于保存到來的連接請求隊列的長度以及綁定本地網絡的接口。它們的基本功能完全相同,但其中有一些使用默認的隊列長度值和默認的綁定地址。4 WEB服務器的設計與實現(xiàn)
28、4.1 Web服務器的程序設計流程根據上述HTTP協(xié)議的作用原理,實現(xiàn)GET請求的Web服務器程序的方法如下: (1) 創(chuàng)建ServerSocket類對象,監(jiān)聽端口8080。這是為了區(qū)別于HTTP的標準TCP/IP端口80而取的; (2) 等待、接受客戶機連接到端口8080,得到與客戶機連接的socket; (3) 創(chuàng)建與socket字相關聯(lián)的輸入流instream和輸出流outstream; (4) 從與socket關聯(lián)的輸入流instream中讀取一行客戶機提交的請求信息,請求信息的格式為:GET 路徑/文件名 HTTP/1.0 (5) 從請求信息中獲取請求類型。如果請求類型是GET,則從
29、請求信息中獲取所訪問的HTML文件名。沒有HTML文件名時,則以index.html作為文件名; (6) 如果HTML文件存在,則打開HTML文件,把HTTP頭信息和HTML文件內容通過socket傳回給Web瀏覽器,然后關閉文件。否則發(fā)送錯誤信息給Web瀏覽器; (7) 關閉與相應Web瀏覽器連接的socket字。 可以總結出Web服務器的設計流程并作出其設計流程圖,如圖4-1所示。圖4-1 Web服務器的程序設計流程4.2 用Java實現(xiàn)Web服務器的主要設計步驟及程序1.點擊開始,打開eclipse軟件,在左框內建立Java工程,在工程中分別建立相應的包和類,如圖3-2所示。圖4-2在工
30、程中分別建立相應的包和類2. 設計主函數(shù)程序在Java工程中建立包main和類WebServerMain,在對應框中輸入以下程序:package com.web.main;import com.web.gui.WebServerFrame;public class WebServerMain /接口的實現(xiàn)public static void main(String args) new WebServerFrame();3.設計Web服務器的圖形界面在Java工程中建立包gui和類WebServerFrame,在對應框中輸入以下程序: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); /將按鈕面板選擇布局管理器進行布局管理構建北部面板pr
32、ivate JLabel listenPortLb = new JLabel(服務器監(jiān)聽端口: );/private JTextField portTf = new JTextField(1111, 5);/寬度設置為5private JButton controlBtn = new JButton(開始);/設置按鈕名稱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);/設置按鍵大小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(););/設置容器的大小setTitle(IIS Web服務器 V01);/命名服務器的名字setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);/構建
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);/構建信息面板public v
36、oid buildHintPan() hintTa.setEditable(false);JScrollPane scrollPane = new JScrollPane();scrollPane.setBorder(BorderFactory.createLoweredBevelBorder();scrollPane.getViewport().add(hintTa);add(scrollPane, BorderLayout.CENTER);/將構建內容面板放置在容器的中間 hintTa.setText(請按“開始”按鈕來開啟Web服務器。); /各個出現(xiàn)的問題監(jiān)測public void a
37、ctionPerformed(ActionEvent arg0) Object source = arg0.getSource();/判斷按鈕提示文字內容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 測試運行5.1 調試運行 為了確保上述程序的正確性,進行調試運行,在工程中建立Folder,并在其內建立html文件,如圖5-1所示。圖5-1 添加html文件在index.html文件中輸入“大家好,我是來自通信0702班的丁弟。我的課程設計是簡單的WEB服務器的設計與實現(xiàn),我所用的語言是JAVA。 謝謝大家?!比缦聢D5-2所示。圖5-2在index.html文件中輸入如圖字樣 接著點擊Web服務器中的
39、“開始”,開啟Web服務器結果顯示為如圖5-3所示。圖5-3 點擊Web服務器中的“開始” 然后打開瀏覽器,輸入網址http:/:1111/index.html,即 Web服務器把該文件內容傳送給了相應的Web瀏覽器。刷新得到如圖5-4所示:圖5-4 把文件內容傳送給相應的Web瀏覽器 服務器窗口顯示內容如圖5-5所示: 5-5 運行服務器訪問結果6 結束語 隨著網絡在人們日常生活中的應用越來越廣泛和嵌入式技術在日常生活中的地位日愈凸顯。這對我們這些有關網絡專業(yè)的學生既是一種挑戰(zhàn),也是一個機遇。通過這次課程設計讓我初步了解了Web服務器的設計和工作原理,掌握了一些JAVA語言和學會使用Ecli
40、pse編程軟件,對我的網絡編程有了很大的提高。與此同時我還學到了一些專業(yè)知識之外的東西。課程設計的過程中,我了解到課程設計不光光是埋頭做設計,也是同學之間互相學習,互相交流經驗的機會;也是大家向老師提出疑問和解答疑問的機會。我覺得課程設計是一個復習課堂上學到知識的機會,也是一個加強學生動手設計能力的機會。設計起初我遇到了一些問題,后來我通過上網,查閱書籍和請教老師,對一些問題有了初步了解。當然在老師和同學的熱心幫助下,我慢慢解開了課程設計中遇到的一些問題,慢慢揭開這門設計的神秘面紗,最終完成了我的課程設計。這次課程設計不僅考察了我們對課堂學的專業(yè)知識的理解程度,也鍛煉了我們的動手能力,提高了我
41、們獨立思考問題,解決問題的能力??傮w上看,我覺得這次課程設計使我自身的知識豐富了不少,但是同時也發(fā)現(xiàn)了自己在動手和專業(yè)知識方面存在的一些問題,例如知識不能融合,不能與實踐相結合,軟件操作不夠熟練,不能靈活運用。使我了解要先學好理論知識才能很好的與實踐相結合,才能熟練的運用到生活中。參考文獻1 Harvey M.Deitel等著邱仲潘等 譯.Java Web服務高級教程 .第一版.機械工業(yè)出版社,2003.72孫衛(wèi)琴. Java網絡編程精解. 北京:電子工業(yè)出版社,2007.33劉賀湘Internet實用技術教程北京:清華大學出版社,19984吳鳳祥.用Java實現(xiàn)一個Socket通信模型.現(xiàn)代
42、電子技術,2001.7.20,155 耿祥義、張躍平.Java2實用教程(第三版).清華大學出版社.2006 附錄1:基于Java 的簡單Web服務器的程序設計與實現(xiàn)/ 程序名稱:WebServer.java/ 程序功能:簡單Web服務器設計與實現(xiàn)/ 程序作者:丁弟/ 最后修改日期:2010-06-30程序1:實現(xiàn)主函數(shù)程序package com.web.main;import com.web.gui.WebServerFrame;public class WebServerMain /接口的實現(xiàn)public static void main(String args) new WebServe
43、rFrame();程序2:實現(xiàn)Web服務器的圖形界面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); /將按鈕面板選擇布局管理器進行布局管理構建北部面板private JLabel listenPortLb = new JLabel(服務器監(jiān)聽端口: );/private JTextField portTf = new JTextField(1111, 5);/寬度設置為5private JButton controlBtn = new JButton(開始);/設置按鈕名稱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);/設置按鍵大小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(););/設置容器的大小setTitle(IIS Web服務器 V01);/命名服務器的名字
47、setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);/構建按鈕面板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);/構建信息面板public void buildHintPan() hintTa.setEditable(false);JScrollPane scrollPane = new JScrollPane();scrollPane.setBorder(BorderFactory.createLoweredBevelBorder();scrollPane.getViewport().add(hintTa);add(scrollPane, BorderLayout.CENTER);/將構建內容面板放置在容器的中間
49、 hintTa.setText(請按“開始”按鈕來開啟Web服務器。); /各個出現(xiàn)的問題監(jiān)測public void actionPerformed(ActionEvent arg0) Object source = arg0.getSource();/判斷按鈕提示文字內容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(復制, 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(關于版本, KeyEvent.VK_A);private WebServerFrame frame=null;public WebServerJMenuBar(WebServerFrame frame) this.frame=frame;initComponent();private void initComponent() /構建文件菜單fileMenu.setMnemonic(KeyEvent.VK_F);fileMenu.add(newWi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于GPS的2025年城市公共自行車智能化改造項目定位系統(tǒng)研究報告
- 2025年乳制品奶源質量控制與品牌營銷創(chuàng)新案例分析報告
- 個人養(yǎng)老金制度2025年對醫(yī)療健康產業(yè)投資的影響與機遇分析報告
- 2025年工業(yè)互聯(lián)網平臺漏洞掃描技術創(chuàng)新與網絡安全產業(yè)生態(tài)報告
- 2025年城市生活垃圾分類處理政策優(yōu)化與公眾參與效果分析報告
- 2025年環(huán)保紙包裝行業(yè)綠色包裝材料市場前景與挑戰(zhàn)研究報告
- 康復醫(yī)療器械行業(yè)前景分析報告:2025年市場需求與產品創(chuàng)新驅動
- 基因治療藥物研發(fā)全產業(yè)鏈解析:2025年臨床研究進展與市場前景報告
- 家具制造業(yè)2025年個性化定制生產模式下的定制家具行業(yè)消費趨勢報告
- K2教育STEM課程實施效果評估報告:2025年教學效果分析
- 2024年中國家具電商行業(yè)市場競爭格局及投資方向研究報告(智研咨詢)
- 導數(shù)(30題)-2024年考前15天高考數(shù)學沖刺大題訓練(新高考)含答案
- 高層建筑一棟一冊消防安全檔案
- 創(chuàng)造性思維與創(chuàng)新方法智慧樹知到期末考試答案章節(jié)答案2024年大連理工大學
- 外科圍手術期營養(yǎng)支持療法
- 廣東省深圳市南山區(qū)2023-2024學年四年級下學期期末科學試題
- 2024年江蘇省高考化學試卷(含答案)
- 2024年安徽省初中(八年級)學業(yè)水平考試初二會考地理試卷真題
- 小學二年級數(shù)學100以內三數(shù)加減混合運算綜合測驗試題大全附答案
- 中國特色社會主義期中測試題-2023-2024學年中職高教版
- 學習康復科常見物理治療法課件
評論
0/150
提交評論