1. 程式人生 > >Java實現簡單web server

Java實現簡單web server

小背景

在《計算機網路-自頂向下方法》這本書中,第二章應用層有個小的程式設計作業,今天將其實驗並記錄下來。

簡介

在計算機網路應用層中最重要的幾個協議有:HTTP,SMTP,FTP,DNS.而平時我們瀏覽網站的時候,每次輸入一個網址,其實就是向某個web伺服器發出請求。例如,當我們輸入:http://www.baidu.com時,其實就是通過HTTP應用層協議傳送請求報文:GET /index.html HTTP/1.1 , 之後客戶端再通過 tcp和伺服器端進行三次握手(握手的過程請參考《TCP協議的三次握手過程》這篇部落格),之後將請求加上傳輸層的頭部發過去,當伺服器端接收到報文之後開始解析報文,是get請求,遵循的是HTTP1.1版本協議,請求的路徑是/index.html,伺服器端知道這些之後給客戶端返回響應報文:報文格式如下:

HTTP/1.1 200 OK
Host: 主機名
Content-Type: text/html;charset=GBK

之後空一行,下面就是相應的資料了,就本例而言就是HTML文件

程式碼實現

本次實現的只是一個簡單的功能:接收請求,不進行判斷,就返回相應,並在瀏覽器上面顯示出來。(後續再對功能進行完善),程式碼寫的糙,各位看官勿見怪。

package httpServer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import
java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * * @author sunyuhu * @category this is a program that simulates HTTP protocol simply. * @version v20180914 */ public class HttpServer { ServerSocket server; //本伺服器 Socket client; //發請求的客戶端
//建構函式 HttpServer(){ try { server = new ServerSocket(5555); } catch (IOException e) { e.printStackTrace(); } } //main 函式 public static void main(String[] args){ HttpServer myserver = new HttpServer(); myserver.begin(); } //在此接受客戶端的請求,並作響應 private void begin() { String httpRequest; String urlRequest; while(true){ try { //開始監聽 client = this.server.accept(); System.out.println("one has connected to this server!!" + client.getLocalPort()); BufferedReader bf = new BufferedReader(new InputStreamReader(client.getInputStream())); httpRequest = bf.readLine(); System.out.println(httpRequest); //獲取到url地址,請求頭中是/index.html ,因此需要將/去掉 urlRequest = httpRequest.split(" ")[1].substring(1); System.out.println(urlRequest); //檢查是否有該檔案,有則返回,無則報錯404 PrintWriter out = new PrintWriter(client.getOutputStream()); //返回一個狀態行 out.println("HTTP/1.0 200 OK"); //返回一個首部 out.println("Content-Type:text/html;charset=GBK"); // 根據 HTTP 協議, 空行將結束頭資訊 out.println(); // 輸出請求資源 out.println("<h1 style='color: green'> Hello Http Server</h1>"); out.println("你好, 這是一個 Java HTTP 伺服器 demo 應用.<br>"); out.println("您請求的路徑是: " + urlRequest + "<br>"); out.close(); } catch (IOException e) { e.printStackTrace(); } } } }

截圖展示

這裡寫圖片描述 這是在瀏覽器中輸入URL,可以看出埠號不在是平時的8080,因為真正的用於web訪問的埠現在正在用著。現在的程式就是相當於在5555這個埠上的一個應用程式。 瀏覽器響應 這個就是模擬的HTTP伺服器對請求的響應。就是在響應的狀態行和首部行的下面的具體的資料資訊。通過這樣的程式設計練習對計算機網路的原理理解會更加深入一些。也希望自己可以堅持下去。