移動端搭建Http Server(四)—— 解析HTTP請求Headers

移動端搭建Http Server(二)—— 實現監聽並驗證中用代碼實現了監聽遠端請求,根據移動端搭建Http Server(三)—— HTTP協議講解的基礎知識,本節實現一下提取HTTP請求Header中的數據。

1.數據流中每個字節都是連起來的,所以要根據流中的\r\n來取每一行數據

思路:用兩個變量來記錄,變量1記錄上一個字節,變量2記錄當前訪問字節,當變量1爲\r且變量2爲\n時,表示一行數據結束。

2.實現一下,新建StreamToolKit類來處理流數據

public static final String readLine(InputStream in) throws IOException {
    StringBuilder sb = new StringBuilder();
    int c1 = 0;
    int c2 = 0;
    // c2=-1表示遍歷到流的結尾
    while (c2 != -1 && !(c1 == '\r' && c2 == '\n')) {
        c1 = c2;
        c2 = in.read();
        sb.append((char) c2);
    }
    if (sb.length() == 0)
        return null;
    return  sb.toString();
}

3.在原來的code的基礎上調用readLine方法

    /**
     * 處理連接後的操作
     * @param remotePeer
     */
    private void onAcceptRemotePeer(Socket remotePeer) {
        try {
//            remotePeer.getOutputStream().write("connected success".getBytes());
            InputStream in = remotePeer.getInputStream();
            String headerLine = null;
            while ((headerLine = StreamToolKit.readLine(in)) != null){
                // 頭數據會以兩個\r\n結尾
                if (headerLine.equals("\r\n"))
                    break;
                System.out.println("headers is :" + headerLine);
            }
        } catch (IOException e) {
            Log.e("an-server", e.toString());
        }
    }

4.運行驗證一下,在瀏覽器地址欄中輸入手機IP和端口看一下打印結果

輸入服務地址

這裏寫圖片描述

查看Logcat結果

這裏寫圖片描述

這些是瀏覽器發送過來的

5.爲了方便後續使用獲取到的信息,將它存在HttpContext類中

public class HttpContext {

    private final HashMap<String, String> requestHeaders;

    public HttpContext() {
        requestHeaders = new HashMap<String, String>();
    }

    private Socket underlySocket;

    public void setUnderlySocket(Socket underlySocket) {
        this.underlySocket = underlySocket;
    }

    public Socket getUnderlySocket() {
        return underlySocket;
    }

    public void addRequestHeader(String headerKey, String headerValue) {
        requestHeaders.put(headerKey, headerValue);
    }

    public  String getRequestHeaderValue(String headerKey){
        return requestHeaders.get(headerKey);
    }

}

在onAcceptRemotePeer中做一點改動

private void onAcceptRemotePeer(Socket remotePeer) {
        try {
//            remotePeer.getOutputStream().write("connected success".getBytes());
            HttpContext httpContext = new HttpContext();
            httpContext.setUnderlySocket(remotePeer);
            InputStream in = remotePeer.getInputStream();
            String headerLine = null;
            while ((headerLine = StreamToolKit.readLine(in)) != null){
                // 頭數據會以兩個\r\n結尾
                if (headerLine.equals("\r\n"))
                    break;
                System.out.println("headers is :" + headerLine);
                String[] pair = headerLine.split(": ");
                httpContext.addRequestHeader(pair[0], pair[1]);
            }
        } catch (IOException e) {
            Log.e("an-server", e.toString());
        }
    }

至此,解析Headers就封裝完成了,源碼依舊push到了github上
https://github.com/jianiuqi/AndroidServer

下篇中講解了URL路由配置,簡單的處理了上傳和下載
移動端搭建Http Server(五)—— 實現URL路由模塊

發佈了44 篇原創文章 · 獲贊 37 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章