移动端搭建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路由模块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值