| 技術 | 角色 |
| HTTP/1.1 | 應用層協議,URL 定位資源,無狀態 |
| HTML 3.2/4.0 | 頁面描述語言,非程式語言 |
| JavaScript / Applet / VBScript | 客戶端動態能力 (本專案支援) |
| JDBC + 後端數據庫 | 動態查詢支撐 (用戶請求 → SQL → 結果 → HTML) |
| CGI 概念 | 舊式動態接口,效率低,已被 Servlet/JSP 取代 |
架構設計:微型 Servlet 容器雛形
- 監聽埠 80:
ServerSocket.accept() 循環
- 解析 HTTP 請求:請求行、Headers、Body → 提取 URL、參數、Cookie
- 路由分發:
- 靜態資源 (.html/.css/.js/.jpg) → 直接讀文件輸出
- 動態路徑 (/video/list, /news/latest) → 調用業務處理器
- 業務處理器:
- 查詢數據庫 (視頻列表、新聞內容)
- 模板引擎生成 HTML (或字符串拼接)
- 設置響應 Headers (Content-Type, Content-Length, Cache-Control)
- 視頻流傳輸:
- 支援
Range 請求頭 (斷點續傳、拖拽播放)
- 分塊讀取視頻文件,輸出
Content-Range、Accept-Ranges: bytes
- 大文件用
FileChannel.transferTo() 零拷貝提升吞吐
關鍵模塊實現要點
HTTP 請求解析器
// 簡易解析邏輯
String requestLine = in.readLine(); // GET /video/1.mp4 HTTP/1.1
String[] parts = requestLine.split(" ");
String method = parts[0];
String url = parts[1];
// 解析 Headers 直到空行
Map headers = new HashMap<>();
String line;
while (!(line = in.readLine()).isEmpty()) {
int colon = line.indexOf(':');
headers.put(line.substring(0, colon).trim(), line.substring(colon+1).trim());
}
// Range 處理
String range = headers.get("Range"); // bytes=1000-
視頻 Range 響應
RandomAccessFile raf = new RandomAccessFile(videoFile, "r");
long fileLen = raf.length();
long start = 0, end = fileLen - 1;
if (range != null) {
// 解析 bytes=start-end
start = parseStart(range);
end = parseEnd(range, fileLen);
}
response.setStatus(range != null ? 206 : 200);
response.setHeader("Content-Type", "video/mp4");
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Length", String.valueOf(end - start + 1));
if (range != null) {
response.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileLen);
}
raf.seek(start);
FileChannel channel = raf.getChannel();
channel.transferTo(start, end - start + 1, response.getOutputStream().getChannel());
擴展方向
- 引入 NIO 非阻塞 (Selector) 支援萬級併發
- 整合 Jetty/Undertow 成熟 Servlet 容器,專注業務
- 採用 HLS/DASH 自適應碼流,替代純 MP4 下載
- CDN 緩存、DRM 版權保護、統計分析平台
從零寫 HTTP 服務器是理解 Web 本質的最佳途徑。生產環境請站在巨人肩膀上——成熟容器 + 業務框架,專注核心價值創造。
- 上一篇文章: Eclipse 3.0插件開發入門:從Hello World到天氣預報插件實戰
- 下一篇文章: 基於Java技術開發Web網絡課件:系統架構與靜動態分離實踐
Copyright ©
程式碼之家 All Rights Reserved