實驗二 實現(xiàn)一個基本的WEB服務(wù)器程序 (2).doc_第1頁
實驗二 實現(xiàn)一個基本的WEB服務(wù)器程序 (2).doc_第2頁
實驗二 實現(xiàn)一個基本的WEB服務(wù)器程序 (2).doc_第3頁
實驗二 實現(xiàn)一個基本的WEB服務(wù)器程序 (2).doc_第4頁
實驗二 實現(xiàn)一個基本的WEB服務(wù)器程序 (2).doc_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

實驗二 實現(xiàn)一個基本的WEB服務(wù)器程序?qū)嶒災(zāi)康?熟悉Socket通訊原理和理解HTTP協(xié)議,了解WEB服務(wù)器的工作原理。實驗要求:采用Socket API知識和對HTTP協(xié)議,CGI(Common Gateway Interface,通用網(wǎng)關(guān)界面)的理解,實現(xiàn)一個基本的WEB服務(wù)器程序,要求服務(wù)器能成功響應(yīng)客戶程序發(fā)來的GET命令(傳輸文件),進一步實現(xiàn)響應(yīng)POST和GET命令的CGI程序用請求。實驗原理與步驟(1) 服務(wù)器主要監(jiān)聽來至客戶瀏覽器或是客戶端程序的連接請求,并且接受到客戶請求后對客戶請求作出響應(yīng)。如果請求時靜態(tài)的文本或是網(wǎng)頁則將內(nèi)容發(fā)送給客戶。如何是CGI程序則服務(wù)器調(diào)用請求的CGI程序,并發(fā)送結(jié)果給客戶。(2) HTTP協(xié)議是基于TCP/IP協(xié)議之上的協(xié)議,是WEB瀏覽器和WEB服務(wù)器之間的應(yīng)用層協(xié)議,是通用的、無狀態(tài)的、面向?qū)ο蟮膮f(xié)議。(3) HTTP的請求一般是GET或POST命令(POST用于FORM參數(shù)的傳遞)。GET命令的格式為:GET路徑/文件名 HTTP/1.0文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。(4) WEB瀏覽器提交請求后,通過HTTP協(xié)議傳送給WEB服務(wù)器。WEB服務(wù)器接到后,進行事務(wù)處理,處理結(jié)果又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請求的頁面。在發(fā)送內(nèi)容之前Web服務(wù)器首先傳送一些HTTP頭信息:HTTP 1.0 200 OKWEBServer:1.0content_type:類型content_length:長度值(5) 響應(yīng)POST和GET命令的CGI程序調(diào)用請求需要服務(wù)器執(zhí)行外部程序,Java執(zhí)行外部可執(zhí)行程序的方法是:首先通過Runtime run=Runtime.getRuntime()返回與當(dāng)前Java應(yīng)用程序相關(guān)的運行時對象;然后調(diào)用Process CGI=run.exec(ProgramName)另啟一個進程來執(zhí)行一個外部可執(zhí)行程序。2.Web服務(wù)器的實現(xiàn)步驟:(1)創(chuàng)建ServerSocket類對象,監(jiān)聽端口8080。這是為了區(qū)別與HTTP的標(biāo)準(zhǔn)TCP/IP端口80而取的;(2)等待、接受客戶機連接到端口8080,得到與客戶機連接的socket;(3)創(chuàng)建于socket字相關(guān)聯(lián)的輸入流和輸出流(4)從與socket關(guān)聯(lián)的輸入流instream中讀取一行客戶機提交的請求信息,請求信息的格式為:GET 路徑/文件名 HTTP/1.0(5)從請求信息中獲取請求類型。如果請求類型是GET,則從請求信息中獲取所訪問的文件名。沒有HTML文件名時,則以index.html作為文件名;(6)如果請求文件是CGI程序則調(diào)用它,并把結(jié)果通過socket傳回給Web瀏覽器,然后關(guān)閉文件。否則發(fā)送錯誤信息給瀏覽器。(7)關(guān)閉與相應(yīng)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();/針對特定的請求創(chuàng)建處理該請求的線程 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;/初始化參數(shù) 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);/處理請求的核心函數(shù) 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)/將客戶端請求的頁面發(fā)送出去 privatestaticvoidsendBytes(FileInputStreamfis,OutputStreamos)throwsExceptionbytebuffer=newbyte1024

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論