BinCat V1 - 簡單的請求文件訪問處理
BinCat V1 - 簡單的請求文件訪問處理
實現一個簡單的Web服務器非常容易,使用ServerSocket在服務器端監聽端口并等待瀏覽器請求,一旦接收到瀏覽器數據后就開始解析Http協議,最后將服務器端請求處理完后通過Socket返回給瀏覽器即可。

V1版本,我們先實現一個簡單的讀取服務器靜態文件的功能,在后續版逐漸完善。
BinCatServerV1實現代碼:
package com.anbai.sec.server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Logger;
/**
* ServerSocket示例
*/
public class BinCatServerV1 {
private static final Logger LOG = Logger.getLogger("info");
public static void main(String[] args) {
try {
// 設置服務監聽端口
int port = 8080;
// 設置服務名稱
String serverName = "BinCat-0.0.1";
// 創建ServerSocket,監聽本地端口
ServerSocket ss = new ServerSocket(port);
LOG.info(serverName + " 啟動成功,監聽端口: " + port);
while (true) {
// 等待客戶端連接
Socket socket = ss.accept();
try {
// 獲取Socket輸入流對象
InputStream in = socket.getInputStream();
// 獲取Socket輸出流對象
OutputStream out = socket.getOutputStream();
// 創建輸出流對象
BufferedReader br = new BufferedReader(new InputStreamReader(in));
// 從Socket中讀取一行數據
String str = br.readLine();
if (str == null) {
continue;
}
// 切割請求Http協議信息
String[] strs = str.split("\\s+");
// 解析Http請求URL地址
String url = strs[1];
// 輸出服務器返回信息
String msg = "";
// 當前服務器運行目錄下的文件
File file = new File(System.getProperty("user.dir"), url);
if (file.exists()) {
out.write("HTTP/1.1 200 OK\n".getBytes());
msg = file.getAbsolutePath();
} else {
out.write("HTTP/1.1 404 Not Found\n".getBytes());
msg = file.getAbsolutePath() + " Not Found!";
}
// 輸出返回字節數
out.write(("Content-Length: " + msg.getBytes().length + "\n").getBytes());
// 寫入換行
out.write("\n".getBytes());
// 將讀取到的數據寫入到客戶端Socket
out.write(msg.getBytes());
in.close();
out.close();
} catch (IOException e) {
LOG.info("處理客戶端請求異常:" + e);
} finally {
socket.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
啟動BinCat服務后控制臺將輸出:
九月 09, 2020 5:18:50 下午 com.anbai.sec.server.BinCatServerV1 main
信息: BinCat-0.0.1啟動成功,監聽端口:8080
瀏覽器請求localhost:8080即可在瀏覽器中輸出當前請求的文件是否存在:

請求一個不存在的文件地址,瀏覽器將會輸出錯誤信息,如請求localhost:8080/test:

從上圖中我們可以看到響應的狀態碼和body都能夠正確的被瀏覽器解析。
Java Web安全
推薦文章: