首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java ServerSocket 進階:自訂 accept() 回傳 Socket 子類別實現 HTTP 請求頭解析

     編輯:Java 相關知識

前言

ServerSocket 的 accept() 預設回傳 Socket 實例。若需回傳擴充功能的子類別(如內建 HTTP 請求頭解析),可覆寫 accept() 並呼叫 implAccept(Socket) 注入未連線的子類別實例。本文示範建立 HttpSocket 並整合至 HttpServerSocket,自動解析瀏覽器發送的 HTTP 請求頭。

實作程式碼

class HttpSocket extends Socket {
    public String getRequestHeaders() throws Exception {
        InputStreamReader isr = new InputStreamReader(getInputStream());
        BufferedReader br = new BufferedReader(isr);
        String s = "", result = "";
        while (!(s = br.readLine()).equals(""))
            result += s + "\r\n";
        return result;
    }
}

class HttpServerSocket extends ServerSocket {
    public HttpServerSocket(int port) throws IOException { super(port); }
    public Socket accept() throws IOException {
        Socket s = new HttpSocket();
        implAccept(s); // 注入子類別實例
        return s;
    }
}

public class CustomAccept {
    public static void main(String[] args) throws Exception {
        HttpServerSocket server = new HttpServerSocket(1234);
        HttpSocket socket = (HttpSocket) server.accept();
        System.out.println(socket.getRequestHeaders()); // 輸出 HTTP 請求頭
        server.close();
    }
}

測試步驟與結果

  1. 執行 java server.CustomAccept
  2. 瀏覽器訪問 https://localhost:1234
  3. 主控台輸出完整 HTTP 請求頭(含 User-Agent、Accept-Encoding、Host 等)

關鍵點

  • implAccept 為 protected final,必須在子類別中呼叫。
  • 回傳的 Socket 需強制轉型為子類別才能呼叫新增方法。
  • 此技巧可用於注入 TLS、壓縮、日誌等橫切功能。

結語

自訂 accept() 回傳類型是 ServerSocket 少為人知但強大的擴充點,能在連接建立瞬間賦予 Socket 額外能力,簡化上層協議處理邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved