




已閱讀5頁,還剩4頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
實驗二 實現一個基本的WEB服務器程序實驗目的 熟悉Socket通訊原理和理解HTTP協議,了解WEB服務器的工作原理。實驗要求:采用Socket API知識和對HTTP協議,CGI(Common Gateway Interface,通用網關界面)的理解,實現一個基本的WEB服務器程序,要求服務器能成功響應客戶程序發來的GET命令(傳輸文件),進一步實現響應POST和GET命令的CGI程序用請求。實驗原理與步驟(1) 服務器主要監聽來至客戶瀏覽器或是客戶端程序的連接請求,并且接受到客戶請求后對客戶請求作出響應。如果請求時靜態的文本或是網頁則將內容發送給客戶。如何是CGI程序則服務器調用請求的CGI程序,并發送結果給客戶。(2) HTTP協議是基于TCP/IP協議之上的協議,是WEB瀏覽器和WEB服務器之間的應用層協議,是通用的、無狀態的、面向對象的協議。(3) HTTP的請求一般是GET或POST命令(POST用于FORM參數的傳遞)。GET命令的格式為:GET路徑/文件名 HTTP/1.0文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。(4) WEB瀏覽器提交請求后,通過HTTP協議傳送給WEB服務器。WEB服務器接到后,進行事務處理,處理結果又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請求的頁面。在發送內容之前Web服務器首先傳送一些HTTP頭信息:HTTP 1.0 200 OKWEBServer:1.0content_type:類型content_length:長度值(5) 響應POST和GET命令的CGI程序調用請求需要服務器執行外部程序,Java執行外部可執行程序的方法是:首先通過Runtime run=Runtime.getRuntime()返回與當前Java應用程序相關的運行時對象;然后調用Process CGI=run.exec(ProgramName)另啟一個進程來執行一個外部可執行程序。2.Web服務器的實現步驟:(1)創建ServerSocket類對象,監聽端口8080。這是為了區別與HTTP的標準TCP/IP端口80而取的;(2)等待、接受客戶機連接到端口8080,得到與客戶機連接的socket;(3)創建于socket字相關聯的輸入流和輸出流(4)從與socket關聯的輸入流instream中讀取一行客戶機提交的請求信息,請求信息的格式為:GET 路徑/文件名 HTTP/1.0(5)從請求信息中獲取請求類型。如果請求類型是GET,則從請求信息中獲取所訪問的文件名。沒有HTML文件名時,則以index.html作為文件名;(6)如果請求文件是CGI程序則調用它,并把結果通過socket傳回給Web瀏覽器,然后關閉文件。否則發送錯誤信息給瀏覽器。(7)關閉與相應web瀏覽器的socket字。3.參考代碼.*;importjava.io.*;importjava.util.*;importjava.lang.*;publicclassWebServerpublicstaticvoidmain(Stringargs)intport;ServerSocketserver_socket;tryport=8080;catch(Exceptione)port=8080;tryserver_socket=newServerSocket(port);System.out.println(WebServerrunningonport+server_socket.getLocalPort();while(true)Socketsocket=server_socket.accept();System.out.println(Newconnectionaccepted+socket.getInetAddress()+:+socket.getPort();/針對特定的請求創建處理該請求的線程 tryhttpRequestHandlerrequest=newhttpRequestHandler(socket);Threadthread=newThread(request);thread.start();catch(Exceptione)System.out.println(e);catch(IOExceptione)System.out.println(e);/處理請求的線程類 classhttpRequestHandlerimplementsRunnablefinalstaticStringCRLF=/r/n;Socketsocket;InputStreaminput;OutputStreamoutput;BufferedReaderbr;/判斷請求的文件類型是否正確 booleanfileType=true;/初始化參數 publichttpRequestHandler(Socketsocket)throwsExceptionthis.socket=socket;this.input=socket.getInputStream();this.output=socket.getOutputStream();this.br=newBufferedReader(newInputStreamReader(socket.getInputStream();/啟動該線程 publicvoidrun()tryprocessRequest();catch(Exceptione)System.out.println(e);/處理請求的核心函數 privatevoidprocessRequest()throwsExceptionwhile(true)StringheaderLine=br.readLine();System.out.println(theclientrequestis+headerLine);if(headerLine.equals(CRLF)|headerLine.equals()break;StringTokenizers=newStringTokenizer(headerLine);Stringtemp=s.nextToken();if(temp.equals(GET)StringfileName=s.nextToken();fileName=.+fileName;FileInputStreamfis=null;booleanfileExists=true;if(!(fileName.endsWith(.htm)|fileName.endsWith(.html)this.fileType=false;tryfis=newFileInputStream(error.html);catch(FileNotFoundExceptione)fileExists=false;elsetryfis=newFileInputStream(fileName);catch(FileNotFoundExceptione)fileExists=false;StringserverLine=Server:asimplejavaWebServer;StringstatusLine=null;StringcontentTypeLine=null;StringentityBody=null;StringcontentLengthLine=error;if(fileExists&this.fileType)statusLine=HTTP/1.0200OK+CRLF;contentTypeLine=Content-type:+this.contentType(fileName)+CRLF;contentLengthLine=Content-Length:+(newInteger(fis.available().toString()+CRLF;elseif(fileExists&this.fileType=false)statusLine=HTTP/1.0400BadRequest+CRLF;contentTypeLine=text/html;entityBody=400NotBadRequest+400BadRequest+usage:http:/yourHostName:port/+fileName.html;elseif(fileExists=false)statusLine=HTTP/1.0404NotFound+CRLF;contentTypeLine=text/html;entityBody=404NotFound+404NotFound+usage:http:/yourHostName:port/+fileName.html;output.write(statusLine.getBytes();output.write(serverLine.getBytes();output.write(contentTypeLine.getBytes();output.write(contentLengthLine.getBytes();output.write(CRLF.getBytes();if(fileExists&this.fileType)sendBytes(fis,output);fis.close();elseoutput.write(entityBody.getBytes();tryoutput.close();br.close();socket.close();catch(Exceptione)/將客戶端請求的頁面發送出去 privatestaticvoidsendBytes(FileInputStreamfis,OutputStreamos)throwsExceptionbytebuffer=newbyte1024
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 先進黨員精神試題及答案
- 武漢理化試題及答案高中
- 廣東省八校聯盟2024-2025學年高一下學期教學質量監測(二) 數學試題(含詳解)
- 2025親子園入學合同協議
- 加強家電公司與供應商的合作與協同
- 2025保險公司委托合同范本2
- 2025國內培訓合同范本
- Haloquinone-生命科學試劑-MCE
- 2025屆高考物理大一輪復習課件 第一章 第5課時 實驗一:探究小車速度隨時間變化的規律
- 初中第一章 機械運動第2節 運動的描述課后練習題
- 公務員制度講座-第二次形成性考核-國開(SC)-參考資料
- 《歐洲古典風格酒店》課件
- 學校德育工作手冊(組織機構 工作職責 流程 制度 要求)
- 醫藥健康安全
- 【MOOC】微生物學-浙江工業大學 中國大學慕課MOOC答案
- 中學生守則40條
- 2mm土工膜長絲土工布檢測報告合格證
- 常用EXCEL函數使用詳解課件
- 2024年大學生求職面試技巧培訓課件
- 急性出血性結膜炎防治
- 百歲居明百歲居居家養老服務
評論
0/150
提交評論