web服务器原理(作业四)
? Web服務(wù)器簡(jiǎn)介:Web服務(wù)器是指駐留于因特網(wǎng)上某種類(lèi)型計(jì)算機(jī)的程序。當(dāng)web瀏覽器(客戶端)連到服務(wù)器上并請(qǐng)求文件時(shí),服務(wù)器將處理該請(qǐng)求并將文件發(fā)送到該瀏覽器上,附帶的信息會(huì)告訴瀏覽器如何查看該文件(即文件類(lèi)型)。服務(wù)器使用HTTP(超文本傳輸協(xié)議)進(jìn)行信息交流,這就是人們常把它們稱(chēng)為HTTPD服務(wù)器的原因。
? ? web服務(wù)器的作用:Web服務(wù)器不僅能夠存儲(chǔ)信息,還能在用戶通過(guò)Web瀏覽器提供的信息的基礎(chǔ)上運(yùn)行腳本和程序。
Web服務(wù)器可以解析HTTP協(xié)議。當(dāng)Web服務(wù)器接收到一個(gè)HTTP請(qǐng)求,會(huì)返回一個(gè)HTTP響應(yīng),例如送回一個(gè)HTML頁(yè)面。為了處理一個(gè)請(qǐng)求Web服務(wù)器可以響應(yīng)一個(gè)靜態(tài)頁(yè)面或圖片,進(jìn)行頁(yè)面跳轉(zhuǎn)或者把動(dòng)態(tài)響應(yīng)的產(chǎn)生委托給一些其它的程序例如CGI腳本,JSP腳本,servlets,asp腳本,服務(wù)器端JavaScript,或者一些其它的服務(wù)器端技術(shù)。無(wú)論它們的目的如何,這些服務(wù)器端的程序通常產(chǎn)生一個(gè)HTML的響應(yīng)來(lái)讓瀏覽器可以瀏覽。?
? ??
? Web服務(wù)器工作原理圖解:
?
工作流程:
(1) 用戶做出了一個(gè)操作,可以是填寫(xiě)網(wǎng)址敲回車(chē),可以是點(diǎn)擊鏈接,可以是點(diǎn)擊按鍵等,接著瀏覽器獲取了該事件。
(2) 瀏覽器與對(duì)端服務(wù)程序建立TCP連接。
(3) 瀏覽器將用戶的事件按照HTTP協(xié)議格式**打包成一個(gè)數(shù)據(jù)包,其實(shí)質(zhì)就是在待發(fā)送緩沖區(qū)中的一段有著HTTP協(xié)議格式的字節(jié)流。
(4) 瀏覽器確認(rèn)對(duì)端可寫(xiě),并將該數(shù)據(jù)包推入Internet,該包經(jīng)過(guò)網(wǎng)絡(luò)最終遞交到對(duì)端服務(wù)程序。
(5) 服務(wù)端程序拿到該數(shù)據(jù)包后,同樣以HTTP協(xié)議格式解包,然后解析客戶端的意圖。
(6) 得知客戶端意圖后,進(jìn)行分類(lèi)處理,或是提供某種文件、或是處理數(shù)據(jù)。
(7) 將結(jié)果裝入緩沖區(qū),或是HTML文件、或是一張圖片等。
(8) 按照HTTP協(xié)議格式將(7)中的數(shù)據(jù)打包
(9) 服務(wù)器確認(rèn)對(duì)端可寫(xiě),并將該數(shù)據(jù)包推入Internet,該包經(jīng)過(guò)網(wǎng)絡(luò)最終遞交到客戶端。
(10) 瀏覽器拿到包后,以HTTP協(xié)議格式解包,然后解析數(shù)據(jù),假設(shè)是HTML文件。
(11) 瀏覽器將HTML文件展示在頁(yè)面
以上為Web服務(wù)器工作基本原理。其實(shí)不難發(fā)現(xiàn),這僅僅只是一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)通信。我們應(yīng)該深信,作為一個(gè)服務(wù)器,其根本的工作無(wú)非有三個(gè)
接收數(shù)據(jù) 2. 發(fā)送數(shù)據(jù) 3. 數(shù)據(jù)處理
而Web服務(wù)器的本質(zhì)就是 接收數(shù)據(jù) ? HTTP解析 ? 邏輯處理 ? HTTP封包 ? 發(fā)送數(shù)據(jù)
高級(jí)的服務(wù)器無(wú)非就是將這三個(gè)部分更加細(xì)致的設(shè)計(jì)了。
在eclipse上搭建簡(jiǎn)單的服務(wù)器:
? request類(lèi)的代碼:
package webServerTest; import java.io.*; public class Request {/** 接收請(qǐng)求的信息,并返回資源(文件名)* */InputStream input;public Request(InputStream input){this.input=input;}public String getUri() throws IOException{String content=null;StringBuffer request = new StringBuffer(); byte[] buffer = new byte[2048]; int i = 0; try { i = input.read(buffer); //讀取內(nèi)容并存入buffer數(shù)組中,并返回讀取的的字節(jié)數(shù)。} catch (IOException e) { e.printStackTrace(); i = -1; } //將buffer數(shù)組轉(zhuǎn)換為字符串for(int k = 0; k < i; k++) { request.append((char)buffer[k]); } content=request.toString();/* *以下方法錯(cuò)誤!用該返回會(huì)使瀏覽器不斷處于請(qǐng)求連接狀態(tài)* BufferedReader br=new BufferedReader(new InputStreamReader(input));while((str=br.readLine())!=null){content=content+str+"\r\n";}*/ if(content!=null)return getFilename(content);else return null;}/*提取文件名*/public String getFilename(String content){int a,b;a=content.indexOf(' ');if(a!=-1){b=content.indexOf('?',a+1);if(b==-1)b=content.indexOf(' ',a+1);return content.substring(a+2,b);}return null;} }response類(lèi)的代碼:
package webServerTest;import java.io.*; import java.io.File; import java.io.IOException; import java.io.OutputStream;public class Response {/*** 響應(yīng)并處理請(qǐng)求信息*/public OutputStream output;public String filename;private static final int BUFFER_SIZE = 1024; public Response(OutputStream output,String filename){this.output=output;this.filename=filename;}public void response() throws IOException{String path=System.getProperty("user.dir");//獲取當(dāng)前的工作目錄byte[] buffer = new byte[BUFFER_SIZE]; int ch; FileInputStream fis = null; //System.out.println(path+File.separator+filename);if(path!=null&&filename!=null){File file=new File(path,filename);String str="";/*必須添加響應(yīng)頭,否則無(wú)法以html格式顯示內(nèi)容*/if(file.exists()){fis = new FileInputStream(file); str = "HTTP/1.1 200 OK \r\n" + "Content-Type: text/html\r\n" + "\r\n" ;output.write(str.getBytes());ch = fis.read(buffer); while(ch != -1) { output.write(buffer, 0, ch); ch = fis.read(buffer, 0, BUFFER_SIZE); } }else{str = "HTTP/1.1 404 File Not Found \r\n" + "Content-Type: text/html\r\n" + "Content-Length: 100\r\n" + "\r\n" + "<h1>404 File Not Found!</h1>"; output.write(str.getBytes());}}output.close();} }webSever的代碼:
package webServerTest; import java.io.*; import java.net.*;public class WebServer {/*** web服務(wù)器:實(shí)現(xiàn)200和404操作* 原理:* 服務(wù)器監(jiān)聽(tīng)一個(gè)端口,并讀取瀏覽器的請(qǐng)求信息,從該信息提取出訪問(wèn)的資源(這里為文件名)。并在工作目錄下查找是否有該資源,有則輸出資源內(nèi)容,否則返回404* 測(cè)試方法:* 1、用String path=System.getProperty("user.dir");獲取當(dāng)前的工作目錄,并在該目錄下放要測(cè)試的文件* 2、訪問(wèn)127.0.0.1:8080/test.html*/public static void main(String[] args) {// TODO Auto-generated method stubServerSocket server = null;Socket s=null;try{server=new ServerSocket(8080,3,InetAddress.getByName("127.0.0.1"));}catch(Exception e){e.printStackTrace();}while(server!=null){try{s=server.accept();OutputStream output=s.getOutputStream();InputStream input=s.getInputStream();//接收請(qǐng)求信息Request request=new Request(input);String filename=request.getUri();//System.out.println(filename);//處理并響應(yīng)請(qǐng)求信息Response response=new Response(output,filename);response.response();}catch(Exception e){e.printStackTrace();}}}}運(yùn)行結(jié)果:
ps:在運(yùn)行過(guò)程中可能會(huì)出現(xiàn)空指針異常的情況,那是因?yàn)槎丝诒徽加脤?dǎo)致的ServerSocket對(duì)象不能被實(shí)例化,在命令行窗口中關(guān)掉占用端口的進(jìn)程就可以了。
? 我的理解:web服務(wù)器的工作步驟可分為建立連接—請(qǐng)求過(guò)程—應(yīng)答過(guò)程—關(guān)閉連接。建立連接就是web服務(wù)器與瀏覽器建立的一種連接。在上述代碼中具體表現(xiàn)為ServerSocket對(duì)象的實(shí)例化。請(qǐng)求過(guò)程就是服務(wù)器接受來(lái)自瀏覽器的請(qǐng)求并作出相應(yīng)處理的過(guò)程。上述代碼中表現(xiàn)為request類(lèi)對(duì)請(qǐng)求信息的處理。應(yīng)答過(guò)程就是服務(wù)器返回給瀏覽器的信息內(nèi)容。就是response中的內(nèi)容。最后就是關(guān)閉連接的過(guò)程。我覺(jué)得上面的代碼并沒(méi)有體現(xiàn)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/ykh-study/p/10538178.html
總結(jié)
以上是生活随笔為你收集整理的web服务器原理(作业四)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Ajax中最有名axios插件(只应用于
- 下一篇: 2019-3-15 模拟赛 T1