Java實現簡單web server
阿新 • • 發佈:2018-12-09
小背景
在《計算機網路-自頂向下方法》這本書中,第二章應用層有個小的程式設計作業,今天將其實驗並記錄下來。
簡介
在計算機網路應用層中最重要的幾個協議有: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伺服器對請求的響應。就是在響應的狀態行和首部行的下面的具體的資料資訊。通過這樣的程式設計練習對計算機網路的原理理解會更加深入一些。也希望自己可以堅持下去。