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