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