web服务器原理(作业四)
? Web服務器簡介:Web服務器是指駐留于因特網上某種類型計算機的程序。當web瀏覽器(客戶端)連到服務器上并請求文件時,服務器將處理該請求并將文件發送到該瀏覽器上,附帶的信息會告訴瀏覽器如何查看該文件(即文件類型)。服務器使用HTTP(超文本傳輸協議)進行信息交流,這就是人們常把它們稱為HTTPD服務器的原因。
? ? web服務器的作用:Web服務器不僅能夠存儲信息,還能在用戶通過Web瀏覽器提供的信息的基礎上運行腳本和程序。
Web服務器可以解析HTTP協議。當Web服務器接收到一個HTTP請求,會返回一個HTTP響應,例如送回一個HTML頁面。為了處理一個請求Web服務器可以響應一個靜態頁面或圖片,進行頁面跳轉或者把動態響應的產生委托給一些其它的程序例如CGI腳本,JSP腳本,servlets,asp腳本,服務器端JavaScript,或者一些其它的服務器端技術。無論它們的目的如何,這些服務器端的程序通常產生一個HTML的響應來讓瀏覽器可以瀏覽。?
? ??
? Web服務器工作原理圖解:
?
工作流程:
(1) 用戶做出了一個操作,可以是填寫網址敲回車,可以是點擊鏈接,可以是點擊按鍵等,接著瀏覽器獲取了該事件。
(2) 瀏覽器與對端服務程序建立TCP連接。
(3) 瀏覽器將用戶的事件按照HTTP協議格式**打包成一個數據包,其實質就是在待發送緩沖區中的一段有著HTTP協議格式的字節流。
(4) 瀏覽器確認對端可寫,并將該數據包推入Internet,該包經過網絡最終遞交到對端服務程序。
(5) 服務端程序拿到該數據包后,同樣以HTTP協議格式解包,然后解析客戶端的意圖。
(6) 得知客戶端意圖后,進行分類處理,或是提供某種文件、或是處理數據。
(7) 將結果裝入緩沖區,或是HTML文件、或是一張圖片等。
(8) 按照HTTP協議格式將(7)中的數據打包
(9) 服務器確認對端可寫,并將該數據包推入Internet,該包經過網絡最終遞交到客戶端。
(10) 瀏覽器拿到包后,以HTTP協議格式解包,然后解析數據,假設是HTML文件。
(11) 瀏覽器將HTML文件展示在頁面
以上為Web服務器工作基本原理。其實不難發現,這僅僅只是一個簡單的網絡通信。我們應該深信,作為一個服務器,其根本的工作無非有三個
接收數據 2. 發送數據 3. 數據處理
而Web服務器的本質就是 接收數據 ? HTTP解析 ? 邏輯處理 ? HTTP封包 ? 發送數據
高級的服務器無非就是將這三個部分更加細致的設計了。
在eclipse上搭建簡單的服務器:
? request類的代碼:
package webServerTest; import java.io.*; public class Request {/** 接收請求的信息,并返回資源(文件名)* */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); //讀取內容并存入buffer數組中,并返回讀取的的字節數。} catch (IOException e) { e.printStackTrace(); i = -1; } //將buffer數組轉換為字符串for(int k = 0; k < i; k++) { request.append((char)buffer[k]); } content=request.toString();/* *以下方法錯誤!用該返回會使瀏覽器不斷處于請求連接狀態* 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類的代碼:
package webServerTest;import java.io.*; import java.io.File; import java.io.IOException; import java.io.OutputStream;public class Response {/*** 響應并處理請求信息*/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");//獲取當前的工作目錄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="";/*必須添加響應頭,否則無法以html格式顯示內容*/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服務器:實現200和404操作* 原理:* 服務器監聽一個端口,并讀取瀏覽器的請求信息,從該信息提取出訪問的資源(這里為文件名)。并在工作目錄下查找是否有該資源,有則輸出資源內容,否則返回404* 測試方法:* 1、用String path=System.getProperty("user.dir");獲取當前的工作目錄,并在該目錄下放要測試的文件* 2、訪問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();//接收請求信息Request request=new Request(input);String filename=request.getUri();//System.out.println(filename);//處理并響應請求信息Response response=new Response(output,filename);response.response();}catch(Exception e){e.printStackTrace();}}}}運行結果:
ps:在運行過程中可能會出現空指針異常的情況,那是因為端口被占用導致的ServerSocket對象不能被實例化,在命令行窗口中關掉占用端口的進程就可以了。
? 我的理解:web服務器的工作步驟可分為建立連接—請求過程—應答過程—關閉連接。建立連接就是web服務器與瀏覽器建立的一種連接。在上述代碼中具體表現為ServerSocket對象的實例化。請求過程就是服務器接受來自瀏覽器的請求并作出相應處理的過程。上述代碼中表現為request類對請求信息的處理。應答過程就是服務器返回給瀏覽器的信息內容。就是response中的內容。最后就是關閉連接的過程。我覺得上面的代碼并沒有體現。
?
轉載于:https://www.cnblogs.com/ykh-study/p/10538178.html
總結
以上是生活随笔為你收集整理的web服务器原理(作业四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ajax中最有名axios插件(只应用于
- 下一篇: 2019-3-15 模拟赛 T1