簡易 Web 伺服器需解析並儲存 HTTP 請求標頭,為後續處理奠基。核心在於 HTTPrequest 類別,封裝請求的所有資訊:版本、方法、請求檔案、客戶端 Socket、輸入流、標頭鍵值對陣列。
import java.io.*;
import java.util.*;
import java.net.*;
public class HTTPrequest {
public String version;
public String method;
public String file;
public Socket clientSocket;
public DataInputStream inbound;
public NameValue[] headerpairs;
public HTTPrequest() {
version = method = file = null;
clientSocket = null;
inbound = null;
headerpairs = new NameValue[0];
}
// 動態擴充標頭陣列
public void addNameValue(String name, String value) {
try {
NameValue[] temp = new NameValue[headerpairs.length + 1];
System.arraycopy(headerpairs, 0, temp, 0, headerpairs.length);
temp[headerpairs.length] = new NameValue(name, value);
headerpairs = temp;
} catch (NullPointerException npe) {
System.out.println("NullPointerException while adding name-value: " + npe);
}
}
@Override
public String toString() {
String s = method + " " + file + " " + version + " ";
for (NameValue nv : headerpairs) s += nv + " ";
return s;
}
}
簡單封裝 name 與 value 兩個字串。每次新增標頭時,HTTPrequest 會建立新陣列、複製舊資料、加入新元素,再替換引用。雖非最高效(可改用 ArrayList),但清晰展示動態陣列擴充邏輯。
HTTPresponse 類別,封裝狀態碼、回應標頭、實體內容輸出。Selector)提升併發能力。此範例為教學示範,生產環境建議採用成熟伺服器(Tomcat、Jetty、Undertow)或 Netty 等高效能網路框架。