




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、簡單web服務器的設計與實現(xiàn)一、 設計內(nèi)容及設計要求 WWW的工作基于客戶機/服務器計算模型,由Web 瀏覽器(客戶機)和Web服務器(服務器)構成,兩者之間采用超文本傳送協(xié)議(HTTP)進行通信,HTTP協(xié)議的作用原理包括四個步驟:連接,請求,應答,關閉應答。設計內(nèi)容Web服務器是web中的關鍵部件,設計一個簡單的Web服務器,為用戶提供簡單的信息服務。設計要求 本實驗要求完成一個簡單的web服務器的設計與實現(xiàn),能夠通過HTTP Get 命令獲得一個簡單的HTML文件。設計目的通過web服務器的設計與實現(xiàn),可以達到以下目的:掌握網(wǎng)絡編程的知識與技能;掌握HTTP協(xié)議的相關知識;熟悉
2、網(wǎng)絡軟件的開發(fā)過程,鍛煉解決實際問題的能力。二、 總體設計HTTP協(xié)議的作用原理包括四個步驟: 連接:Web瀏覽器與Web服務器建立連接,打開一個稱為socket(套接字)的虛擬文件,此文件的建立標志著連接建立成功。 請求:Web瀏覽器通過socket向Web服務器提交請求。HTTP的請求一般是GET或POST命令(POST用于FORM參數(shù)的傳遞)。GET命令的格式為: GET 路徑/文件名 HTTP/1.0 文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。 應答:Web瀏覽器提交請求后,通過HTTP協(xié)議傳送給Web服務器。Web服務器接到后,進行事務處理,處理結果
3、又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請求的頁面。 關閉連接:當應答結束后,Web瀏覽器與Web服務器必須斷開,以保證其它Web瀏覽器能夠與Web服務器建立連接。 客戶端采用的是瀏覽器,整個系統(tǒng)需要設計的是服務器服務器的用例描述服務器實現(xiàn)的功能可以描述為3個用例允許建立連接提供服務允許斷開連接 服務器的活動圖整個工作流程如下三、 詳細設計及代碼服務器對象的靜態(tài)關系服務器對象的靜態(tài)關系服務器類的設計public class Main 啟動程序public class Frame extends JFrame implements ActionListener 實現(xiàn)系統(tǒng)管理
4、員查看服務器狀態(tài)public class Net 實現(xiàn)允許建立連接,提供服務,允許斷開連接 代碼public class Main 啟動程序package server;/ http:/ylx-PC:1111/index.htmlpublic class Main /接口的實現(xiàn)public static void main(String args) /啟動程序new Frame(); /建立窗體public class Frame extends JFrame implements ActionListener 實現(xiàn)系統(tǒng)管理員查看服務器狀態(tài)package server;import java.
5、awt.*;import java.awt.event.*;import java.util.Date;import javax.swing.*;public class Frame extends JFrame implements ActionListener / 建立窗體組件 JPanel btnPan = new JPanel(new FlowLayout(FlowLayout.CENTER); private JLabel listenPortLb = new JLabel("設置監(jiān)聽端口: ");private JLabel tishi = new JLabel
6、("Webserver信息:");private JLabel tian = new JLabel(" ");private JTextField portTf = new JTextField("8080", 4);/設置默認端口號JButton controlBtn = new JButton("開始");/設置按鈕名稱JButton clearHintBtn = new JButton("清空");private JTextArea hintTa = new JTextArea("
7、;動態(tài)監(jiān)測服務信息n");private Net net;public Frame() initComponent(); /初始化界面net = new Net(this);private void initComponent() /初始化所有界面組件buildBtnPan();buildHintPan();setSize(600, 450);/設置窗體大小Toolkit tool = Toolkit.getDefaultToolkit();setLocation(tool.getScreenSize().width - this.getSize().width) / 2,(tool
8、.getScreenSize().height - this.getSize().height) / 2); /設置窗體位置 this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent arg0) Frame.this.setVisible(true);Frame.this.dispose(););setTitle("一個簡單的 Web服務器");setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);/構建按鈕面板p
9、ublic void buildBtnPan() /實現(xiàn)窗體布局JLabel tc= new JLabel();Box boxV1=Box.createHorizontalBox();Box boxV2=Box.createHorizontalBox();Box box=Box.createVerticalBox();boxV1.add(listenPortLb);boxV1.add(Box.createHorizontalStrut(10);boxV1.add(portTf);boxV1.add(Box.createHorizontalStrut(10);boxV1.add(controlB
10、tn); boxV2.add(tishi);boxV2.add(Box.createHorizontalStrut(10);boxV2.add(tian);boxV2.add(Box.createHorizontalStrut(10);boxV2.add(clearHintBtn); box.add(boxV1); box.add(Box.createVerticalStrut(8); box.add(boxV2);btnPan.add(box); /加入所有按鍵add(btnPan, BorderLayout.NORTH);/將按鍵放置在北部面板portTf.requestFocus();p
11、ortTf.selectAll();controlBtn.addActionListener(this);clearHintBtn.addActionListener(this);public void buildHintPan() hintTa.setEditable(false);JScrollPane scrollPane = new JScrollPane(); /添加滑動條scrollPane.setBorder(BorderFactory.createLoweredBevelBorder();scrollPane.getViewport().add(hintTa);add(scro
12、llPane, BorderLayout.CENTER); /置在中部面板public void actionPerformed(ActionEvent arg0) /各個出現(xiàn)的問題監(jiān)測Object source = arg0.getSource();/判斷按鈕提示文字內(nèi)容if (source = clearHintBtn) hintTa.setText("");return;String msg = controlBtn.getText();if (msg.equals("開始") controlBtn.setText("停止");
13、tian.setText("服務器啟動接口 "+portTf.getText();portTf.setEditable(false);net.start(portTf.getText();hintTa.setText(hintTa.getText()+"n-" +"-開啟服務器 "+new Date().toLocaleString()+"-nn"); else tian.setText("關閉服務器接口 "+portTf.getText();controlBtn.setText("開
14、始");portTf.setEditable(true);net.stop();public void addHint(String s) hintTa.setText(hintTa.getText() + s);public class Net 實現(xiàn)允許建立連接,提供服務,允許斷開連接 package server;import java.io.*;import .*;import java.util.*;import javax.swing.*;public class Net /實現(xiàn)允許建立連接,提供服務,允許斷開連接 int i=0;private Frame frame;p
15、rivate ServerSocket serverSocket;public Net(Frame frame) /將WebServerFrame 和WebServerNet連接起來this.frame=frame;/點擊“開始”按鈕出現(xiàn)的結果public void start(String port) /對異常進行處理try serverSocket=new ServerSocket(Integer.parseInt(port);new Thread()/對于線程重寫run()public void run() trywhile(true) Socket socket=serverSocke
16、t.accept();/允許與服務器連接new HandlerThread(socket).start();/開啟線程catch (Exception e) JOptionPane.showMessageDialog(frame, e.getMessage();.start(); catch (Exception ex) JOptionPane.showMessageDialog(frame, ex.getMessage();public void stop() tryif(serverSocket!=null)serverSocket.close();catch(Exception e) f
17、inallyframe.addHint("n-" +"-關閉服務器 "+new Date().toLocaleString()+"-n");/增加新的線程class HandlerThread extends Thread private Socket socket;private String hostName;public HandlerThread(Socket socket) this.socket=socket;this.hostName=socket.getInetAddress().getHostAddress();i+
18、;frame.addHint(" "+i+" "+"主機 "+hostName+" 連接成功 ");/重寫 run()public void run() BufferedReader in=null;/瀏覽器和服務器間交互的輸入流PrintStream out=null; /瀏覽器和服務器間交互的輸出流BufferedInputStream fin=null; /服務器端文件的輸入字符流tryin=new BufferedReader(new InputStreamReader(socket.getInputStr
19、eam();out=new PrintStream(socket.getOutputStream();/從瀏覽器提交的請求頭部中獲得想訪問的文件名稱String src=in.readLine().split(" ")1;/將瀏覽器想獲得的文件名稱輸出至提示框frame.addHint("獲得服務 "+" 時間"+new Date().toLocaleString()+"n");/對瀏覽器想獲得的文件名稱進行去除?后面內(nèi)容處理/示例: /index.html?a=b -> /index.htmlint ind
20、ex=src.indexOf("?");if(index>=0)src.substring(0,index);/如果瀏覽器沒指定訪問的頁面,則返回 index.html 頁面內(nèi)容if("/".equals(src) src="/index.html"File srcFile=new File("html"+src);/如果瀏覽器訪問的頁面不存在,則返回 404.html 頁面內(nèi)容if(!srcFile.exists()|!srcFile.canRead()srcFile=new File("html
21、/404.html");/輸出響應頭部信息out.println("HTTP/1.1 200 OK");out.println("服務器: IIS Web服務器 V01");out.println("最后修改時間: "+new Date(srcFile.lastModified();out.println("文件總字節(jié): "+getContentType(srcFile);out.println("文件總長度: "+srcFile.length();out.println("
22、時間: "+new Date();out.println();/輸出響應體部信息fin=new BufferedInputStream(new FileInputStream(srcFile);byte buffer=new byte1024*8;int i=-1;while(i=fin.read(buffer)!=-1) out.write(buffer,0,i);catch(Exception e) e.printStackTrace();finallytryif(in!=null)in.close();if(out!=null)out.close();if(fin!=null)
23、fin.close();catch(Exception e)/文件的接收public String getContentType(File file) String fileName=file.getName();String type=fileName.substring(fileName.indexOf(".");String result="空"if(".gif".equals(type) result="image/gif"else if(".html".equals(type) res
24、ult="text/html"else if(".htm".equals(type) result="text/html"else if(".txt".equals(type) result="text/plain"else if(".xml".equals(type) result="text/xml"return result;四、 調(diào)試及運行結果啟動用exe4j生成的myserver.exe應用程序初始化如圖設置端口8080,單擊開始 開啟服務器打開瀏覽器 地址欄輸入
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年金融行業(yè)數(shù)據(jù)治理與隱私保護在支付清算系統(tǒng)中的安全策略報告
- 西方政治制度中的政治經(jīng)濟關系試題及答案
- 負載均衡與網(wǎng)絡優(yōu)化試題及答案
- 技術標準與協(xié)議試題及答案
- 現(xiàn)代技術在企業(yè)民主管理中的應用前景
- 新手必看2025信息系統(tǒng)項目管理師試題及答案
- 企業(yè)戰(zhàn)略決策中的風險管理與應對策略
- 機電工程行業(yè)資質(zhì)考試及試題及答案解析
- 公共政策中的社區(qū)參與機制探究試題及答案
- 政治思想與當代問題試題及答案
- 建筑工地安全月教育課件
- 速度輪滑講解課件
- 2025屆湖北省武漢華中師大一附中高三最后一模化學試題含解析
- 2025屆湖北省武漢華中師大一附中5月高考適應性考試英語試題試卷含解析
- 《上市公司社會責任報告披露要求》
- 重癥患者譫妄管理指南及標準解讀
- 三布五油防腐施工方案
- 第三單元課外古詩詞《逢入京使》課件【知識精研】七年級語文下冊(統(tǒng)編版2024)
- 生產(chǎn)經(jīng)營單位主要負責人和安全管理人員安全培訓資料
- 危大工程安全管理檔案(2019版)
- 【MOOC】《學術寫作與國際發(fā)表》(北京科技大學)章節(jié)測驗慕課答案
評論
0/150
提交評論