




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、簡單Web服務器設計與實現摘 要 WWW的工作基于客戶機/服務器計算模型,由Web 瀏覽器(客戶機)和Web服務器(服務器)構成,兩者之間采用超文本傳送協議(HTTP)進行通信,HTTP協議的作用原理包括四個步驟:連接,請求,應答,關閉應答。在課程設計中,系統開發平臺為Win7,程序設計語言采用Java,程序運行平臺為Eclipse。在程序設計中,采用了結構化與面向對象兩種解決問題的方法。程序通過調試運行,初步實現了設計目標,并且經過適當完善后,將可以應用在商業中解決實際問題。關鍵詞 計算模型;Java;HTTP;Web服務器1 前言Internet是目前世界上最大的計算機互聯網絡,與大家的生
2、活、學習、工作有著越來越密切的關系,它遍布全球,將世界各地各種規模的網絡連接成一個整體,其用戶群十分龐大,因此,建設一個好的Web站點對于一個機構的發展十分重要。近年來,隨著網絡用戶要求的不斷提高及計算機科學的迅速發展,特別是數據庫技術在Internet中的廣泛應用,Web站點向用戶提供的服務將越來越豐富,越來越人性化。本課程設計主要解決由Web 瀏覽器(客戶機)和Web服務器(服務器)構成,兩者之間采用超文本傳送協議(HTTP)進行通信的Web服務器的程序設計。1.1 課程設計前準備以下的工作均是建立在大量的調查基礎上的,是Web服務器開發前期準備工作所解決的問題。(1)Java簡介Java
3、是由sun公司開發的一種新型的面向對象的程序設計語言,主要用于web頁面的設計1。Java語言的流行除了因為它能夠編制嵌入HTML文件中的Applet外,還在于Java語言本身的面向對象、簡單、平臺無關性、安全性、多線程等特點。Java語言的發展頗具傳奇性,它與Internet的WWW的迅猛發展是分不開的。由于其發展迅速,有人將它比喻為Internet上的世界語。前面講到在Internet上Web頁面的設計采用的是HTML語言,用戶借助于Web瀏覽器(如Netscape,HotJava,IE等),可以訪問到遠程web服務器上靜態的、具有超鏈接的Web頁面2。 (2)HTTP協議簡介HTTP 協
4、議是應用層的協議,定義了服務器端和客戶端之間文件傳輸的溝通方式。HTTP協議用于從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。由于HTTP協議支持的服務不限于WWW,還可以是其它服務,它允許用戶在統一的界面下,采用不同的協議訪問不同的服務。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示等3。1.2 課程設計的內容(1)熟悉WWW服務器和WEB服務器的工作原理;(2)熟悉套接字編程的相關知識;(3)完成一個簡單的WEB服務器的設計與實現,要求能夠通過HTTP GET命令獲得一個簡單的HTML文件;(4)運行該
5、服務器,并編寫一個簡單的HTML文件完成測試。1.3 課程設計要求(1)按要求編寫課程設計報告書,能正確闡述設計結果。(2)通過課程設計培養學生嚴謹的科學態度,認真的工作作風和團隊協作。(3)學會文獻檢索的基本方法和綜合運用文獻的能力。(4)在老師的指導下,要求每個學生獨立完成課程設計的全部內容。1.4 課程設計平臺 Windows7系統;Eclipse軟件平臺2 Web服務器的工作原理2.1 HTTP協議的作用原理WWW是以Internet作為傳輸媒介的一個應用系統,WWW網上最基本的傳輸單位是Web網頁。WWW的工作基于客戶機/服務器計算模型,由Web 瀏覽器(客戶機)和Web服務器(服務
6、器)構成,兩者之間采用超文本傳送協議(HTTP)進行通信。HTTP協議是基于TCP/IP協議之上的協議,是Web瀏覽器和Web服務器之間的應用層協議,是通用的、無狀態的、面向對象的協議。HTTP協議的作用原理包括四個步驟:連接,請求,應答,關閉應答。 wsHTTP協議的作用原理包括四個步驟: (1)連接:Web瀏覽器與Web服務器建立連接,打開一個稱為socket(套接字)的虛擬文件,此文件的建立標志著連接建立成功。 (2) 請求:Web瀏覽器通過socket向Web服務器提交請求。HTTP的請求一般是GET或POST命令(POST用于FORM參數的傳遞)。GET命令的格式為: GET 路徑/
7、文件名 HTTP/1.0 文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。 (3) 應答:Web瀏覽器提交請求后,通過HTTP協議傳送給Web服務器。Web服務器接到后,進行事務處理,處理結果又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請求的頁面。 例:假設客戶機與:8080/mydir/index.html建立了連接,就會發送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開發語言相關知識與技術Java主要技術有:多線程,I/O流操作,網絡編程。 java中的多線程及實現:Java是面向對象的程序語言,用Java進行程序設計就是設計和使用類,Java為我們提供了線程類Thread來創建線程,創建線程與創建普通的類的對象的操作是一樣的,而線程就是Thread類
9、或其子類的實例對象。下面是一個創建啟動一個線程的語句: Thread thread1=new Thread(); file:/聲明一個對象實例,即創建一個線程; Thread1.run(); file:/用Thread類中的run()方法啟動線程; 從這個例子,我們可以通過Thread()構造方法創建一個線程,并啟動該線程。事實上,啟動線程,也就是啟動線程的run()方法,而Thread類中的run()方法沒有任何操作語句,所以這個線程沒有任何操作。要使線程實現預定功能,必須定義自己的run()方法。Java中通常有兩種方式定義run()方法: 通過定義一個Thread類的子類,在該子類中重寫
10、run()方法。Thread子類的實例對象就是一個線程,顯然,該線程有我們自己設計的線程體run()方法,啟動線程就啟動了子類中重寫的run()方法。 通過Runnable接口,在該接口中定義run()方法的接口。所謂接口跟類非常類似,主要用來實現特殊功能,如復雜關系的多重繼承功能。線程被實際創建后處于待命狀態,激活(啟動)線程就是啟動線程的run()方法,這是通過調用線程的start()方法來實現的。 線程狀態:1)New當線程對象被創建時,處于該狀態。 2)Runnable:就緒狀態,線程滿足運行的所有條件但沒有正在運行的線程位于該狀態,有以下幾種情況: a.處于New狀態的線程執行sta
11、rt()。 b.處于Running狀態的線程失去CPU。 c.處于Otherwise Block狀態的線程阻塞解除。 d.處于Lock Block狀態的線程阻塞解除。 3)Running:運行狀態處于運行狀態的線程可能發生以下幾種情況: a.線程運行結束,進入Dead狀態。 b.CPU被分配給其它線程,進入Runnable狀態。 c.滿足Otherwise Block的條件,進入Otherwise Block狀態。 d.由于鎖的原因無法執行,進入Lock Block狀態。 e.由于等待的原因無法執行,進入Wait Block狀態。 4)Dead:死亡狀態線程運行結束,對于主線程main()結束
12、,對于普通用戶線程run()結束。 5)Otherwise Block:阻塞狀態,阻塞解除后進入Runnable狀態 a.調用sleep(),阻塞解除條件為阻塞時間滿。 b.調用join(),阻塞解除條件為調用join()的線程執行結束。注意:線程進入該狀態不會釋放鎖。 6)Lock Block:鎖阻塞狀態,阻塞解除后進入Runnable狀態由于無法獲得需要的鎖而阻塞地線程進入該狀態,阻塞解除條件為獲得所需的鎖。 7)Wait Block:等待阻塞狀態,阻塞解除后進入Lock Block狀態由于某個資源的原因必須進行等待,則進入該狀態。阻塞解除條件為其它線程調用該資源的notify()或not
13、ifyAll()。下面一個例子實踐了如何通過上述兩種方法創建線程并啟動它們: / 通過Thread類的子類創建的線程; class thread1 extends Thread file:/自定義線程的run()方法; public void run() System.out.println(Thread1 is running); file:/通過Runnable接口創建的另外一個線程; 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類的子類創建線程; Thread threadtwo=new Thread(new thread2(); file:/用Runnable接口類的對象創建線程; threadone.start(); threadtwo.start(); file:/strat()方法啟動線程; 運行該程序就可以看出,線
15、程threadone和threadtwo交替占用CPU,處于并行運行狀態。可以看出,啟動線程的run()方法是通過調用線程的start()方法來實現的(見上例中主類),調用start()方法啟動線程的run()方法不同于一般的調用方法,調用一般方法時,必須等到一般方法執行完畢才能夠返回start()方法,而啟動線程的run()方法后,start()告訴系統該線程準備就緒可以啟動run()方法后,就返回start()方法執行調用start()方法語句下面的語句,這時run()方法可能還在運行,這樣,線程的啟動和運行并行進行,實現了多任務操作。 IO字節流操作1)Java中使用流的方式處理數據,基
16、本的處理類為InputStream(字節讀入流)和OutputStream(字節輸出流)。2)可以使用各種過濾流對流數據進行過濾,實現各種附加功能。3)對字節流進行轉換和包裝可以獲得字符流,字符流的基本處理流為Reader(字符讀入流)和Writer(字符輸出流)。a.字節流:InputStream:int read()讀入流中的一個字節并返回,數據存放在int的低8位中;int read(byte)讀入流中的若干個字節,存放在byte中,返回讀入字節的數量;int read(byte,int,int)讀入流中的若干個字節,存放在byte中從第一個int參數開始(索引),最大長度為第二個int
17、參數的區間內。OutputStream:flush()將輸出緩沖區中的信息寫到真正的輸出設備。調用方法: 輸出緩沖區滿:自動調用; 調用close()時先調用flush():自動調用; 手動調用flush()最常見的情況是產生異常時,雖然在finally中會對流執行close(),但在異常條件下,close()能保證對流的關閉,但在調用flush()時會有漏洞。b.字符流:優點:操作文本數據時比較直觀,讀入和寫出都以char為基本單位。缺點:底層依然以字節流方式操作,所以在任何情況下都必須有轉換的過程,效率相對較低。操作二進制數據時會存在編碼問題,一般不使用字符流操作二進制數據。InputSt
18、reamReader:將字節讀入流轉為字符讀入流。InputStreamReader(InputStream):使用默認字符集(取決的JVM)將InpustStream轉為InputStreamReader。InputStreamReader(InputStream, String):使用String指定的字符集將InputStream轉為InputStreamReader。OutputStreamWriter:將字符輸出流轉為字節輸出流。OutputStreamWriter(OutputStream):使用默認字符集(取決于JVM)將OutputStreamWriter轉為OutputStr
19、eam。OutputStreamWriter(OutputStream, String):使用String指定的字符集將OutputStreamWriter轉為OutputStream。BufferedReader:提供緩沖;readLine()。BufferedWriter:提供緩沖。PrintWriter:提供緩沖;print()、println()等方法。注意:在開發中,一般使用BufferedReader和PrintWriter結合使用完成對字符流的過濾。 網絡架構:1)C/S網絡架構客戶端/服務器架構,通常情況下,數據存儲在服務器端,客戶端和服務器端都有一個獨立的應用程序,可以進行獨
20、立的操作,通過網絡進行數據傳輸。常用的傳輸協議包括:TCP/IP:基于連接的協議優點:由于是有連接的傳輸,對于數據的準確性是有保證的。缺點:系統資源占用較多。UDP/IP:無連接的協議(數據報)優點:系統資源占用少。缺點:無法保證傳輸的準確性。用途:a.對于數據少量丟失可以接受的應用。b.存在足夠數據冗余的應用。2)B/S網絡架構瀏覽器/服務器架構,在服務器端完成幾乎所有的功能(包括數據存儲),客戶端的瀏覽器只完成和服務器交互和顯示服務器傳輸的信息的功能。常用的傳輸協議包括:http:超文本傳輸協議。https:支持多種加密操作的超文本傳輸協議。優點:客戶端不需要安裝任何附加軟件,同時整個應用
21、的升級也相對簡單。IP:通過IP Address和Port(端口)定位具體的應用;Port的有效范圍是065535,通常在開發應用時應避免使用1000以下的端口,1000以下有很多端口被常用應用占用。IP Address在JDK5.0中支持4位或6位兩種方式,現在4位的占據主導地位,但將來會逐漸過渡到6位IP地址的模式。TCP/IP協議的實現:a.ServerSocket類:服務器端使用,用于監聽客戶端的請求。b.Socket類:服務器端和客戶端使用,用于完成具體通信的所有功能。UDP/IP協議的實現:a.DatagramSocket類:服務器端和客戶端使用,用于實現通信的基本功能。b.Dat
22、agramPacket類:服務器端和客戶端使用,用于封裝通信的內容信息。3 開發環境及套字接編程3.1 Web服務器的開發環境 該課程設計是基于Java編程語言的設計的Web服務器,開發環境是Eclipse軟件和Java Swing。(1)Eclipse簡介 Eclipse 是一個開放源代碼的、基于 Java 的可擴展開發平臺。就其本身而言,它只是一個框架和一組服務,用于通過插件和組件構建開發環境。Eclipse 附帶了一個標準的插件集,包括 Java 開發工具。Eclipse采用的技術是IBM公司開發的(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運行在服務器上并監聽到來的 TCP連接。 每個ServerSocket都在服務器上的指定端口監聽。當遠程主機上的客戶Socket試圖與指定端口建立連接時,服務器被激活,判定客戶程序與服務器的連接,并打開兩個主機之間固有的Socket。一旦與服務器套接字建立了連接,則服務器就可以使用固有的Socket對象向客戶機發送數據。數據總是通過固有的套接字傳遞。 ServerSocket類 ServerSocket類包含了用 Java編寫服務器程序的
25、所有內容。它包括創建新 ServerSocket對象的構造器、在指定端口監聽連接的方法,以及連接建立后可以發送和接收數據時返回 Socket對象的方法。此外,它還有設置不同選項以及各種各樣常用的方法,例如 toString()方法。 服務器的基本生命期是: 1. 利用 ServerSocket()構造器在指定端口創建一個新的 ServerSocket; 2. ServerSocket利用它的accept()方法在指定端口監聽到來的連接。accept()方法一直處于阻塞狀態,直到有客戶機試圖建立連接。這時 accept()方法返回連接客戶機何服務器的 Socket; 3. 調用 getInput
26、Stream()方法、getOutputStream()方法或者兩者都調用來得到與客戶機通信的輸入流和輸出流,具體調用哪一個方法還是兩者都調用與具體服務器的類型有關; 4. 服務器和客戶機根據雙方都承認的協議進行交互,直到關閉連接時為止; 5. 服務器、客戶機或兩者均關閉連接; 6. 服務器返回步驟 2,等待下一個連接到來。如果在4步花費的時間很長或時間無限期,則wu-ftpd這樣的傳統Unix服務器會創建一個新的進程來處理每個連接,從而使服務器在同一時刻可以為多個客戶機提供服務。 構造器 一共有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服務器的設計與實現
28、4.1 Web服務器的程序設計流程根據上述HTTP協議的作用原理,實現GET請求的Web服務器程序的方法如下: (1) 創建ServerSocket類對象,監聽端口8080。這是為了區別于HTTP的標準TCP/IP端口80而取的; (2) 等待、接受客戶機連接到端口8080,得到與客戶機連接的socket; (3) 創建與socket字相關聯的輸入流instream和輸出流outstream; (4) 從與socket關聯的輸入流instream中讀取一行客戶機提交的請求信息,請求信息的格式為:GET 路徑/文件名 HTTP/1.0 (5) 從請求信息中獲取請求類型。如果請求類型是GET,則從
29、請求信息中獲取所訪問的HTML文件名。沒有HTML文件名時,則以index.html作為文件名; (6) 如果HTML文件存在,則打開HTML文件,把HTTP頭信息和HTML文件內容通過socket傳回給Web瀏覽器,然后關閉文件。否則發送錯誤信息給Web瀏覽器; (7) 關閉與相應Web瀏覽器連接的socket字。 可以總結出Web服務器的設計流程并作出其設計流程圖,如圖4-1所示。圖4-1 Web服務器的程序設計流程4.2 用Java實現Web服務器的主要設計步驟及程序1.點擊開始,打開eclipse軟件,在左框內建立Java工程,在工程中分別建立相應的包和類,如圖3-2所示。圖4-2在工
30、程中分別建立相應的包和類2. 設計主函數程序在Java工程中建立包main和類WebServerMain,在對應框中輸入以下程序:package com.web.main;import com.web.gui.WebServerFrame;public class WebServerMain /接口的實現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(服務器監聽端口: );/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服務器。); /各個出現的問題監測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服務器的設計與實現,我所用的語言是JAVA。 謝謝大家。”如下圖5-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 結束語 隨著網絡在人們日常生活中的應用越來越廣泛和嵌入式技術在日常生活中的地位日愈凸顯。這對我們這些有關網絡專業的學生既是一種挑戰,也是一個機遇。通過這次課程設計讓我初步了解了Web服務器的設計和工作原理,掌握了一些JAVA語言和學會使用Ecli
40、pse編程軟件,對我的網絡編程有了很大的提高。與此同時我還學到了一些專業知識之外的東西。課程設計的過程中,我了解到課程設計不光光是埋頭做設計,也是同學之間互相學習,互相交流經驗的機會;也是大家向老師提出疑問和解答疑問的機會。我覺得課程設計是一個復習課堂上學到知識的機會,也是一個加強學生動手設計能力的機會。設計起初我遇到了一些問題,后來我通過上網,查閱書籍和請教老師,對一些問題有了初步了解。當然在老師和同學的熱心幫助下,我慢慢解開了課程設計中遇到的一些問題,慢慢揭開這門設計的神秘面紗,最終完成了我的課程設計。這次課程設計不僅考察了我們對課堂學的專業知識的理解程度,也鍛煉了我們的動手能力,提高了我
41、們獨立思考問題,解決問題的能力。總體上看,我覺得這次課程設計使我自身的知識豐富了不少,但是同時也發現了自己在動手和專業知識方面存在的一些問題,例如知識不能融合,不能與實踐相結合,軟件操作不夠熟練,不能靈活運用。使我了解要先學好理論知識才能很好的與實踐相結合,才能熟練的運用到生活中。參考文獻1 Harvey M.Deitel等著邱仲潘等 譯.Java Web服務高級教程 .第一版.機械工業出版社,2003.72孫衛琴. Java網絡編程精解. 北京:電子工業出版社,2007.33劉賀湘Internet實用技術教程北京:清華大學出版社,19984吳鳳祥.用Java實現一個Socket通信模型.現代
42、電子技術,2001.7.20,155 耿祥義、張躍平.Java2實用教程(第三版).清華大學出版社.2006 附錄1:基于Java 的簡單Web服務器的程序設計與實現/ 程序名稱:WebServer.java/ 程序功能:簡單Web服務器設計與實現/ 程序作者:丁弟/ 最后修改日期:2010-06-30程序1:實現主函數程序package com.web.main;import com.web.gui.WebServerFrame;public class WebServerMain /接口的實現public static void main(String args) new WebServe
43、rFrame();程序2:實現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(服務器監聽端口: );/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服務器。); /各個出現的問題監測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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江永縣2025年三下數學期末預測試題含解析
- 山東省陽谷縣第二中學2024-2025學年高三3月月考調研考試物理試題含解析
- 山西管理職業學院《工程安全與環境保護》2023-2024學年第二學期期末試卷
- 鄭州美術學院《植物學》2023-2024學年第二學期期末試卷
- 吉林省長春市重點名校2025屆初三3月三校聯考-生物試題含解析
- 天津大學《果蔬貯藏技術》2023-2024學年第二學期期末試卷
- 喉癌放療患者護理查房
- 護理服務態度投訴零容忍
- 銷售培訓與提升策略
- 2025水利工程修復合同
- DBJ33T 1319-2024 住宅小區供配電工程技術標準
- 室上性心動過速-醫學課件
- 英語專業四級聽力50篇
- 2024年《網絡反不正當競爭暫行規定》重點解讀
- NB-T20048-2011核電廠建設項目經濟評價方法
- 課件:敏捷制造概述-美化講解
- CJT156-2001 溝槽式管接頭
- CJJT146-2011 城鎮燃氣報警控制系統技術規程
- 臭氧在骨科疾病治療中的應用
- 修補外墻防水合同
- 20萬噸有機肥項目可行性研究報告
評論
0/150
提交評論