1. 程式人生 > >自己寫一個簡單的Web伺服器(附Demo)

自己寫一個簡單的Web伺服器(附Demo)

一、什麼是Web伺服器?
先來寫個例子親身體驗一下。下面的示例程式碼演示瞭如何通過 java.net.Socket 與 java.net.ServerSocket這兩個重要的類建立一個簡單基於 Java 的 Web 伺服器 。這個伺服器通過8784號埠提供訪問,向瀏覽器返回一個固定的靜態網頁。在這個示例中,請求的訊息由瀏覽器生成, 併發送到伺服器,這個程式將簡單地顯示請求的訊息。 迴應的訊息由伺服器程式生成, 通過 Socket傳輸層返回給瀏覽器。

import java.net.*;
import java.io.*;
public class Server {
    public
static void main(String[] args) throws Exception { int port=8784; ServerSocket server=new ServerSocket(port); //自定埠,建立服務端Socket System.out.println("開始監聽,埠號:"+port); while(true){ Socket client=server.accept();//監聽獲取客戶端請求socket,accept方法是一個阻塞方法,在客戶端和服務端之間建立聯絡之前一直等待阻塞
System.out.println(client.getInetAddress()); //返回客戶端地址 byte requestbuffer[]=new byte[4096];//準備讀取客戶端請求的資料,讀取資料儲存在buffer陣列 InputStream inp=client.getInputStream(); int length=inp.read(requestbuffer,0,requestbuffer.length); String requestString=new
String(requestbuffer,"UTF-8"); /*DataInputStream requestdata=new DataInputStream(client.getInputStream());*/ System.out.println(requestString);//返回請求資料 OutputStream out=client.getOutputStream(); String statusLine = "HTTP/1.1 200 OK\r\n"; byte[] statusLineBytes = statusLine.getBytes("UTF-8"); String responseBody= "<html><head><title>From Socket Server</title></head><body><h1>Hello, world.</h1></body></html>"; byte[] responseBodyBytes = responseBody.getBytes("UTF-8"); // 迴應的頭部 String responseHeader ="Content-Type: text/html; charset=UTF-8\r\nContent-Length: "+responseBody.length()+"\r\n"; byte[] responseHeaderBytes = responseHeader.getBytes("UTF-8"); // 向客戶端傳送狀態資訊 out.write(statusLineBytes); // 向客戶端傳送迴應頭 out.write(responseHeaderBytes); // 頭部與內容的分隔行 out.write(new byte[] { 13, 10 }); // 向客戶端傳送內容部分 out.write(responseBodyBytes); // 斷開與客戶端的連線 client.close(); } } }

來執行一下:
1、開啟CMD命名行,找到Server.java位置,然後輸入java Server.java ,編譯通過後,再輸入java Server 。

2、開啟瀏覽器,在URL位址列,輸入localhost:8784

執行結果:
這裡寫圖片描述
cmd命令列
這裡寫圖片描述
瀏覽器顯示我們返回的內容

二、當我們往瀏覽器位址列輸入Url……
當我們往瀏覽器位址列輸入Web伺服器的地址(我們在位址列中輸入的內容稱為通用資源識別符號(URI),它有很多種形式,在Web中我們通常使用稱為統一資源定位符(URL)。它的格式是:協議://主機〔,埠號〕[絕對路徑 [?引數l])之後,瀏覽器將幫助我們把對伺服器的請求轉換為一系列引數傳送給Web伺服器。伺服器收到瀏覽器發來的請求引數之後,將會分析這些資料並進行處理。然後向瀏覽器迴應處理的結果,也就是一些新的資料;這些資料可以是html頁面頁或者圖片、視訊、音訊等等多媒體檔案。瀏覽器收到之後,解析這些資料,將它們呈現在瀏覽器的視窗,就是我們現在看到的網頁。
在瀏覽器與Web伺服器的對話中,需要使用雙方都能夠理解的語法規範進行通訊,而這通訊過程中的語法規範標準就是協議, 瀏覽器與Web伺服器之間的協議是HTTP協議,它是基於TCP/IP協議,專門用於瀏覽器與Web伺服器之間通訊的應用層協議。客戶機(瀏覽器)與伺服器之間通過請求和響應完成一次會話(Session) 每次會話中,通訊雙方傳送的資料稱為訊息(Message},訊息分為兩種:清求訊息和迴應訊息。每個訊息由三部分組成,第一部分為請求行或者回應的狀態行,第二部分為訊息的頭部,第三部分為訊息體部分。訊息頭部分和訊息體部分使用一個空行進行分隔。
瀏覽器和伺服器之間的會話
概括來說就是:Web瀏覽器按照HTTP協議的規定向web伺服器發出請求資訊,Web伺服器接收到瀏覽器的請求後,再按照HTTP協議的要求將結果傳送給Web瀏覽器。
可以用一句話概括一下:Web伺服器會對HTTP請求進行處理並提供響應。當然術語“Web伺服器”可以用來表示Web伺服器的軟體,也可以用來表示提供Web頁面的特定裝置或計算機。
三、實際的Web伺服器會做些什麼?
有了上面直觀的體驗和一些對瀏覽器和伺服器互動的認識,我們現在可以來看看Web伺服器在我們看不到的地方偷偷地幹了哪些事,是怎麼響應客戶機的請求的呢?大致來說,有以下幾件:
1、建立連線——接受一個客戶端連線。或者如果不希望與這個客戶端建立連線,就
將其關閉。
2、接收請求——從網路中讀取一條HTTP請求報文。
3、處理請求——對請求報文進行解釋,並採取行動。
4、訪問資源——訪問報文中指定的資源。
5、構建響應——建立帶有正確首部的HTTP響應報文。
6、傳送響應——將響應回送給客戶端。
7、記錄事務處理過程——將與已完成事務有關的內容記錄在一個日誌檔案中。