1. 請求行,狀態行只有一行
2. 消息頭由只有一個部分
3. 消息頭與實體之間通過空行隔開(\r\n)
4. 可以存在多個實體部分,實體之間通過空行分開(在Content-type: multipart/form-data的類型當中)
5.連續兩個\r\n只是一個部分的分隔符
6. 消息頭,實體頭的格式
1. xxxx:<空格> yyy,uuu <\r><\n>
如Accept: text/html,image/*
2.xxxx:<空格>yyy;aa= <空格> bbb<\r><\n>
Content-Dispostion: attachment; filename=aa.zip
3.xxxx: 空格 ccc=zzz; <空格>ii= ooo <\r><\n>
Cookie: uuid_t=9988778; un=px348402717
7. 在請求當中傳遞自定字段的方式
1. 在消息頭當中
2. 在form表單當中,method=get時,存放在url ? xxx=ddd&ss=ww
3. 在form表單當中,method=post時,且消息頭的Content-type:multipar/form-data存放在實體頭當中,
Content-Dispostion:form-data;name=”user”
4.在form表單當中,method=post時,且消息頭的Content-type:application/x-www-form-urlencoded
在實體當中的格式
para1=abc¶m2=xxxy
8. Web 服務器與Socket之間的關係
1. accept 循環
server對於connection不需要專門的維護與管理,使用玩就可以關閉
2. connection循環
socket –> buffer –> serialization->bussiness
bussiness其是直接使用utf-8編碼,沒有使用類似 google protobuf.這樣在解碼編碼的時候會簡單一些。推論:不是字符串就是二進制數據,這樣方便處理,如表單上傳文件,客戶端先完整發送表單,然後再寫入二進制數據,服務器在解析時候,根據寫入數據的順序,以\r\n做爲TCP分包的標識。
依次解析請求行,消息頭,這些是byte 直接按utf-8轉換成字符串,然後根據Content-type,Content-length,Transfer-Encoding等之類來讀取實體數據。
核心: 以純二進制流的概念來讀取數據,讀取緩存當中,然後\r\n分包,轉換成字符串,再根據情況判斷客戶端發送數據的方式,以對應的方式接收數據。
這樣就很好支持,一會寫入消息頭之類的字符串數據,一會寫入文件之的二進制數據。我們均將其以byte處理。且因爲client在connection上是按請求響應這樣的流程寫入數據,不會在流程當中寫入其他的,或重複消息頭數據。