




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、簡單web服務(wù)器的設(shè)計與實現(xiàn)一、 設(shè)計內(nèi)容及設(shè)計要求 WWW的工作基于客戶機/服務(wù)器計算模型,由Web 瀏覽器(客戶機)和Web服務(wù)器(服務(wù)器)構(gòu)成,兩者之間采用超文本傳送協(xié)議(HTTP)進行通信,HTTP協(xié)議的作用原理包括四個步驟:連接,請求,應(yīng)答,關(guān)閉應(yīng)答。設(shè)計內(nèi)容Web服務(wù)器是web中的關(guān)鍵部件,設(shè)計一個簡單的Web服務(wù)器,為用戶提供簡單的信息服務(wù)。設(shè)計要求 本實驗要求完成一個簡單的web服務(wù)器的設(shè)計與實現(xiàn),能夠通過HTTP Get 命令獲得一個簡單的HTML文件。設(shè)計目的通過web服務(wù)器的設(shè)計與實現(xiàn),可以達到以下目的:掌握網(wǎng)絡(luò)編程的知識與技能;掌握HTTP協(xié)議的相關(guān)知識;熟悉
2、網(wǎng)絡(luò)軟件的開發(fā)過程,鍛煉解決實際問題的能力。二、 總體設(shè)計HTTP協(xié)議的作用原理包括四個步驟: 連接:Web瀏覽器與Web服務(wù)器建立連接,打開一個稱為socket(套接字)的虛擬文件,此文件的建立標志著連接建立成功。 請求:Web瀏覽器通過socket向Web服務(wù)器提交請求。HTTP的請求一般是GET或POST命令(POST用于FORM參數(shù)的傳遞)。GET命令的格式為: GET 路徑/文件名 HTTP/1.0 文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。 應(yīng)答:Web瀏覽器提交請求后,通過HTTP協(xié)議傳送給Web服務(wù)器。Web服務(wù)器接到后,進行事務(wù)處理,處理結(jié)果
3、又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請求的頁面。 關(guān)閉連接:當應(yīng)答結(jié)束后,Web瀏覽器與Web服務(wù)器必須斷開,以保證其它Web瀏覽器能夠與Web服務(wù)器建立連接。 客戶端采用的是瀏覽器,整個系統(tǒng)需要設(shè)計的是服務(wù)器服務(wù)器的用例描述服務(wù)器實現(xiàn)的功能可以描述為3個用例允許建立連接提供服務(wù)允許斷開連接 服務(wù)器的活動圖整個工作流程如下三、 詳細設(shè)計及代碼服務(wù)器對象的靜態(tài)關(guān)系服務(wù)器對象的靜態(tài)關(guān)系服務(wù)器類的設(shè)計public class Main 啟動程序public class Frame extends JFrame implements ActionListener 實現(xiàn)系統(tǒng)管理
4、員查看服務(wù)器狀態(tài)public class Net 實現(xiàn)允許建立連接,提供服務(wù),允許斷開連接 代碼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)管理員查看服務(wù)器狀態(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("設(shè)置監(jiān)聽端口: ");private JLabel tishi = new JLabel
6、("Webserver信息:");private JLabel tian = new JLabel(" ");private JTextField portTf = new JTextField("8080", 4);/設(shè)置默認端口號JButton controlBtn = new JButton("開始");/設(shè)置按鈕名稱JButton clearHintBtn = new JButton("清空");private JTextArea hintTa = new JTextArea("
7、;動態(tài)監(jiān)測服務(wù)信息n");private Net net;public Frame() initComponent(); /初始化界面net = new Net(this);private void initComponent() /初始化所有界面組件buildBtnPan();buildHintPan();setSize(600, 450);/設(shè)置窗體大小Toolkit tool = Toolkit.getDefaultToolkit();setLocation(tool.getScreenSize().width - this.getSize().width) / 2,(tool
8、.getScreenSize().height - this.getSize().height) / 2); /設(shè)置窗體位置 this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent arg0) Frame.this.setVisible(true);Frame.this.dispose(););setTitle("一個簡單的 Web服務(wù)器");setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);/構(gòu)建按鈕面板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("服務(wù)器啟動接口 "+portTf.getText();portTf.setEditable(false);net.start(portTf.getText();hintTa.setText(hintTa.getText()+"n-" +"-開啟服務(wù)器 "+new Date().toLocaleString()+"-nn"); else tian.setText("關(guān)閉服務(wù)器接口 "+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)允許建立連接,提供服務(wù),允許斷開連接 package server;import java.io.*;import .*;import java.util.*;import javax.swing.*;public class Net /實現(xiàn)允許建立連接,提供服務(wù),允許斷開連接 int i=0;private Frame frame;p
15、rivate ServerSocket serverSocket;public Net(Frame frame) /將WebServerFrame 和WebServerNet連接起來this.frame=frame;/點擊“開始”按鈕出現(xiàn)的結(jié)果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();/允許與服務(wù)器連接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-" +"-關(guān)閉服務(wù)器 "+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;/瀏覽器和服務(wù)器間交互的輸入流PrintStream out=null; /瀏覽器和服務(wù)器間交互的輸出流BufferedInputStream fin=null; /服務(wù)器端文件的輸入字符流tryin=new BufferedReader(new InputStreamReader(socket.getInputStr
19、eam();out=new PrintStream(socket.getOutputStream();/從瀏覽器提交的請求頭部中獲得想訪問的文件名稱String src=in.readLine().split(" ")1;/將瀏覽器想獲得的文件名稱輸出至提示框frame.addHint("獲得服務(wù) "+" 時間"+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");/輸出響應(yīng)頭部信息out.println("HTTP/1.1 200 OK");out.println("服務(wù)器: IIS Web服務(wù)器 V01");out.println("最后修改時間: "+new Date(srcFile.lastModified();out.println("文件總字節(jié): "+getContentType(srcFile);out.println("文件總長度: "+srcFile.length();out.println("
22、時間: "+new Date();out.println();/輸出響應(yīng)體部信息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)試及運行結(jié)果啟動用exe4j生成的myserver.exe應(yīng)用程序初始化如圖設(shè)置端口8080,單擊開始 開啟服務(wù)器打開瀏覽器 地址欄輸入
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度企業(yè)導(dǎo)師制師帶徒培養(yǎng)合同
- 2025年度人合作合伙合同:清潔能源項目投資合作框架
- 2025年度醫(yī)療護理勞務(wù)合同患者安全與權(quán)益保障合同
- 2025年度倉儲物流轉(zhuǎn)租服務(wù)合同
- 2025年度店面轉(zhuǎn)讓定金支付及品牌戰(zhàn)略合作協(xié)議
- 2025年度倉儲設(shè)施使用權(quán)及倉儲倉儲服務(wù)協(xié)議
- 2025年杭州醫(yī)學(xué)院單招職業(yè)適應(yīng)性測試題庫完整版
- 2025年度個人短期租房合同月付與租戶退租流程管理協(xié)議
- 2025年度合伙投資開中式餐廳合作協(xié)議
- 2025年度互聯(lián)網(wǎng)企業(yè)產(chǎn)品經(jīng)理崗位聘用合同
- 軟壓光機計算說明
- 森林防火安全責任書(施工隊用)
- 《汽車性能評價與選購》課程設(shè)計
- 35kV絕緣導(dǎo)線門型直線桿
- 水庫應(yīng)急搶險與典型案例分析
- 49式武當太極劍動作方位
- 工程成本分析報告(新)
- 國際學(xué)術(shù)會議海報模板16-academic conference poster model
- 經(jīng)典誦讀比賽評分標準【精選文檔】
- 高值耗材參考目錄
- 步兵戰(zhàn)斗動作
評論
0/150
提交評論