版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、簡單web服務(wù)器的設(shè)計與實現(xiàn)一、設(shè)計內(nèi)容及設(shè)計要求WWW的工作基于客戶機(jī)/服務(wù)器計算模型,由Web瀏覽器(客戶機(jī))和 Web服務(wù)器(服務(wù)器)構(gòu)成, 兩者之間采用超文本傳送協(xié)議(HTTP)進(jìn)行通信,HTTP協(xié)議 關(guān)閉應(yīng)答。的作用原理包括四個步驟:連接,請求,應(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),可以達(dá)到以下目的:掌握網(wǎng)絡(luò)編程的知識與技 能;掌握HTTP協(xié)議的相關(guān)知識;熟悉網(wǎng)
2、絡(luò)軟件的開發(fā)過程,鍛煉解決實際問題 的能力。二、總體設(shè)計HTTP協(xié)議的作用原理包括四個步驟:連接:Web瀏覽器與 Web服務(wù)器建立連接,打開一個稱為 socket (套接字)的虛擬文件,此文 件的建立標(biāo)志著連接建立成功。請求: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ù)器接到后,進(jìn)行 事務(wù)處理,處理
3、結(jié)果又通過 HTTP傳回給 Web瀏覽器,從而在 Web瀏覽器上顯示岀所請求的頁 面。關(guān)閉連接:當(dāng)應(yīng)答結(jié)束后,Web瀏覽器與 Web服務(wù)器必須斷開, 以保證其它 Web瀏覽器能夠與Web服務(wù)器建立連接??蛻舳瞬捎玫氖菫g覽器,整個系統(tǒng)需要設(shè)計的是服務(wù)器服務(wù)器的用例描述服務(wù)器實現(xiàn)的功能可以描述為3個用例 允許建立連接提供服務(wù)允許斷開連接.服務(wù)器的活動圖整個工作流程如下三、詳細(xì)設(shè)計及代碼服務(wù)器對象的靜態(tài)關(guān)系服務(wù)器對象的靜態(tài)關(guān)系服務(wù)器類的設(shè)計public class Mai n啟動程序public class Frame exte nds JFrame impleme nts Action Liste
4、 ne 實現(xiàn)系統(tǒng)管理員查看 服務(wù)器狀態(tài)public class Net實現(xiàn)允許建立連接,提供服務(wù),允許斷開連接代碼啟動程序public class Ma inserver; package/ http:/ylx-PC:1111/index.html啟動程序 void main(String args) 建立窗體new Frame();接口的實現(xiàn) class Main / public/ public static/ 實現(xiàn)系統(tǒng)管理員查 public class Frame extends JFrame implements ActionListener 看服務(wù)器狀態(tài)server; package
5、java.awt.*;import java.awt.event.*;javax.swing.*;importActionListener implementsextends建立窗體組件newnew JPanel(JPanelbtnPan =import java.util.Date;importJFrame public class Frame/); CENTERFIowLayout(FlowLayout.private JLabel listenPortLb = new JLabel(設(shè)置監(jiān)聽端口 ?);privateJLabeltishi =new JLabel(Webserver 信息
6、尺);privateJLabeltian=new JLabel();設(shè)置,4);/ portTf JTextField =new JTextField( ?尰 private默認(rèn)端口號 設(shè)置按鈕名稱);/ JButton controlBtn = new JButton( 開始);清空 JButton(JButtonclearHintBtn = new); 屜屮=new JTextArea(動態(tài)監(jiān)測服務(wù)信息hintTa private JTextArea; private Net net Frame() public初始化界面 / initComponent(););this Net( new
7、 = netvoid / buildBtnPan();private初始化所有界面組件initComponent() buildHintPan();設(shè)置窗體大小 / setSize(600, 450);();getDefaultToolkit Toolkit tool = Toolkit. -widthsetLocation(tool.getScreenSize().) / 2,width this .getSize().-(tool.getScreenSize().height ) / 2height this .getSize().設(shè)置窗體位置/);WindowAdapter()newth
8、is .addWindowListener(public void windowClosing(WindowEvent arg0) Frame. this .setVisible( true );Frame. this .dispose();););服務(wù)器WebsetTitle( 個簡單的);EXIT_ON_CLOSE setDefaultCloseOperation();true setVisible(/構(gòu)建按鈕面板voidpublic buildBtnPan() ();Box boxV1=Box.createHorizontalBox/ 實現(xiàn)窗體布局JLabel();new JLabel
9、tc=();createHorizontalBox Box boxV2=Box. Box box=Box.createVerticalBox(););listenPortLbboxV1.add(10); boxV1.add(Box. createHorizontalStrut);boxV1.add(portTf (10); boxV1.add(Box.createHorizontalStrutboxV1.add(tishi );); controlBtnboxV2.add(10); boxV2.add(Box.createHorizontalStrut);tian boxV2.add(10);
10、 boxV2.add(Box. createHorizontalStrut );boxV2.add( clearHintBtnbox.add(boxV1);box.add(Box. createVerticalStrut(8);box.add(boxV2);btnPan .add(box);/加入所有按鍵add( btnPan , BorderLayout.NORTH );/將按鍵放置在北部面板portTf .requestFocus();portTf .selectAII();controlBtn .addActionListener(this););this .addActionListe
11、ner(clearHintBtnbuildHintPan() void publichintTa .setEditable(false);JScrollPane scrollPane =new JScrollPane();/添加滑動條scrollPane.setBorder(BorderFactory. createLoweredBevelBorder(););scrollPane.getViewport().add(置在中部面板hintTa add(scrollPane,BorderLayout. CENTER); /public void actionPerformed(ActionEve
12、nt arg0) Object source = arg0.getSource();/各個岀現(xiàn)的問題監(jiān)測/判斷按鈕提示文字內(nèi)容if (source =clearHintBtn) hintTa .setText();return ;.getText();controlBtnString msg =) if(msg.equals(開始);controlBtn.setText(停止.getText();tian.setText(服務(wù)器啟動接口 ?尠+ portTf );portTf.setEditable(false.getText(); .start(portTfnet hintTa .setTe
13、xt( hintTa .getText()+ ? +-開啟服務(wù)器?尠+newDate().toLocaleString()+nn ); else tian .setText( 關(guān)閉服務(wù)器接口+ portTf.getText();controlBtn .setText( 開始);portTf .setEditable(true );net .stop();addHint(String s) public void.getText() + s);hintTa .setText( hintTa public class Net實現(xiàn)允許建立連接,提供服務(wù),允許斷開連接packageserver;imp
14、ortjava.io.*;import.*;importjava.util.*;importjavax.swing.*;publicclass Net int i=0;/實現(xiàn)允許建立連接,提供服務(wù),允許斷開連接private Frame frame ;private ServerSocketserverSocketpublic Net(Frame frame) / 將 WebServerFrame 和 WebServerNet 連接起來this . frame =frame;/點擊“開始”按鈕岀現(xiàn)的結(jié)果public void start(String port) /對異常進(jìn)行處理try ser
15、verSocket =new ServerSocket(lnteger. parselnt(port);Thread() newrun() 對于線程重寫run() voidpublic try ) whiletrue (允許與服務(wù)器連接new/ serverSocket Socket socket=.accept();/ 開啟線程 HandlerThread(socket).start();(Exception e) catch , e.getMessage(); showMessageDialog (frame JOptionPane.start(); catch (Exception ex
16、) ,ex.getMessage(); JOptionPane.(showMessageDialogframestop() public void try)!= serverSocket ( ifnull.close();serverSocket catch (Exception e) finally frame .addHint( 屜湜?尭 +-關(guān)閉服務(wù)器?尠+newDate().toLocaleString()+? 尭湜);增加新的線程/ Thread Socket socket privateextendsclassHandlerThreadhostName String private
17、HandlerThread(Socket socket) public=socket; socketthis=socket.getlnetAddress().getHostAddress();hostName this+:主機(jī)尠 +hostName + 連接成功? frame .addHint(?尠 + i +);重寫 run() / run() in= null :publicvoid瀏覽器和服務(wù)器間交互/ BufferedReader的輸入流/ : Printstream out=null瀏覽器和服務(wù)器間交互的輸岀流BufferedlnputStream fin=流null/服務(wù)器端文件的
18、輸入字符try in= new BufferedReader(newInputStreamReader(socket.getlnputstream();new PrintStream(.getOutputStream(); out=獲得想訪問的文件名稱)1; String src=in.readLine().split(將瀏覽器想獲得的文件名稱輸岀至提示框socket /從瀏覽器提交的請求頭部中/frame .addHint(獲得服務(wù)尠+時間+newDate().toLocaleString()+屜湜);/對瀏覽器想獲得的文件名稱進(jìn)行去除?后面內(nèi)容處理/ 示例 : /index.html?a=
19、b -> /index.htmlint index=src.indexOf(?);if (index>=O)src.substring(O,index);/如果瀏覽器沒指定訪問的頁面,則返回index.html頁面內(nèi)容if (屜尯.equals(src) src=屜椯摮硥栮浴屬:File srcFile= new File( 桜浴屬 +src);/如果瀏覽器訪問的頁面不存在,則返回 404.html頁面內(nèi)容.if (!srcFile.exists()|!srcFile.canRead();桜浴屬?栮浴屬File( newsrcFile=/輸岀響應(yīng)頭部信息out.println(?吠
20、屐??傳屋);out.println(服務(wù)器:IIS Web 服務(wù)器嘠?);out.println(最后修改時間?+newDate(srcFile.lastModified();out.println(文件總字節(jié):+getContentType(srcFile);out.println(文件總長度?+srcFile.length();out.println( 時間?+ new Date();while out.write(buffer,0,i);out.println();fin= new BufferedlnputStream(newFilelnputStream(srcFile);1024
21、*8; intbytebyte buffer=newi=-1;/輸岀響應(yīng)體部信息(i=fin.read(buffer)!=-1) (Exception e) catch e.printStackTrace(); finallytry )in.close();null (in!= if)out.close(); (out!=ifnull )fin.close();(fin!=if null(Exception e)catch 文件的接收 / String getContentType(File file) public StringfileName=file.getName(););String
22、 type=fileName.substring(fileName.indexOf(?>空 String result=;楜慭敧?楧屨 ?楧屨(if .equals(type) result=;?瑨汭(ifelse .equals(type) result=瑜硥屴栯浴屬;瑜硥屴栯浴屬?瑨屭(ifelseelse .equals(type) result=;瑜硥屴瀯僅湩.equals(type) result=?硴屴(if;.equals(type) result=?浸屬(if else瑜硥屴砯汭 result; return調(diào)試及運(yùn)行結(jié)果四、.啟動用exe4j生成的 myserver.exe應(yīng)用程序初始化如圖開啟服務(wù)器,單擊開始8080設(shè)置端口.打開瀏覽器地址欄輸入 -pc:8080/得到結(jié)果如圖服務(wù)器端結(jié)果.單擊停止,暫停服務(wù)器服務(wù)五、總結(jié)通過此次實驗,我基本了解了 Web服
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 預(yù)防犯罪-遠(yuǎn)離傷害培訓(xùn)課件
- 2024年浙江郵電職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 艾瑞咨詢-2022年中國商業(yè)銀行私域運(yùn)營專題研究報告
- 2024年泉州幼兒師范高等??茖W(xué)校高職單招語文歷年參考題庫含答案解析
- 2024年朔州陶瓷職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 2024年昭通衛(wèi)生職業(yè)學(xué)院高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 2024年山東城市建設(shè)職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 2024年安徽現(xiàn)代信息工程職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 2024年寧波城市職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
- 福建省南平市仙陽中學(xué)高一語文月考試題含解析
- 國際標(biāo)準(zhǔn)IQ測試題及答案樣本
- 美容院管理制度章程
- 統(tǒng)編版六年級下冊語文1-6單元習(xí)作課件
- 社會安全風(fēng)險評估模型的研究
- 七年級下冊英語單詞默寫表直接打印
- 讀書分享遙遠(yuǎn)的救世主
- 貴州省黔南布依族苗族自治州2023-2024學(xué)年九年級上學(xué)期期末數(shù)學(xué)試題(含答案)
- 通信安全生產(chǎn)培訓(xùn)課件
- 《新疆大學(xué)版學(xué)術(shù)期刊目錄》(人文社科)
- 部編版九年級語文下冊第7課《溜索》精美課件
- 腹部常見疾病超聲診斷課件
評論
0/150
提交評論