1. 程式人生 > >2017-9-7 - A - WebServer項目

2017-9-7 - A - WebServer項目

轉型 線程 服務 eth stringbu 智能識別 業務邏輯 是否 整體

1 緩沖流的readLine方法是否阻塞?

2 請求(獲取),響應(返回),分別的格式什麽?HTTP的規則是什麽?
http請求格式

一次請求,一次響應,沒有請求,沒有響應。

3 HTTP協議是什麽?
超文本傳輸協議,是瀏覽器與服務器間的傳輸通訊協議。

4 HTTP請求由什麽組成?
請求行,消息頭,消息正文。

5 請求行格式是什麽?
Method Request-URI HTTP-VersionCRLF
(CR:指代不同系統中的回車 LF:指代不同系統中的換行——CRLF:換行到最開始,即該行結束)
如:
GET /index.html HTTP/1.1CRLF
POST /login.html HTTP/1.1CRLF

6 什麽是DNS?
將域名綁定在指定IP地址,訪問時域名轉換成對應IP地址。

7 CRLF的作用是?
表示當行結束。

8 服務器可否使用br(BufferedReader)按行快速讀取請求頭(CRLF換行)?如果不能用什麽?具體讀取流程是?
不可,br換行只看\n(不會智能識別不同系統下的換行)
使用StringBuilder一個字符一個字符讀取,直到讀取到CR(13),LF(10)為止。
具體讀取流程:判斷當次及上次的數字是否等於10和13,如果是就跳出,如果不是,就將當次的值轉型成char後加入builder並將當次的值賦給c2,用以下次判斷
且由於最後字符多出CRLF,必須用String.trim()去掉這兩個空白字符。
int c1 = -1,c2 = -1
while((c1 = in.read())! = -1){
if(c1 == 10 && c2 == 13){
break;
}
bulider.append((char)c1);
c2 = c1;
}
String line = builder.toString().trim();

9 HTTP請求默認訪問什麽端口?
80

10 請求頭中包含的URI將會請求服務器中的網頁。

11 第一次獲取請求頭時while(true)中需要包含is嗎?
不需要,is獲取的是一大段,循環基準是換行而不是重新獲取數據。

12 當需要同時處理多個用戶發送過來的請求時,用while(true)還是線程?
線程,因為需要同時,而不是處理完一個再處理另一個。

13 為何需要用到線程池?
提高並發效率。

14 是否需要將讀取請求行等分開?
是。

15 讀取HTTP請求的流程是?
讀取請求行
讀若幹行(直到讀取了CRLF)。
讀取消息正文
分析請求行請求什麽資源

16 業務邏輯要極其清晰,一個方法實現一個功能。

服務器整體業務流程,
新建一個服務器獲取請求,讀取處理請求,返回請求資源
將後兩個流程中包入ClietnHandler(新建類),一旦有新的請求便創建新的線程,由於線程較多,因此需要用線程池管理。
ClientHandler中的主要流程又是run方法,run方法(便是包含獲取,讀取,處理請求)的流程為,
①讀取請求,將請求項轉化為對象,方便後續檢索確定返回的數據。
對象包括請求頭及消息頭查找表,將處理該對象的方法也寫入。
消息頭查找表在使用前必須實例化,不然用不了
跳出循環的判斷條件是 返回字符串長度為0 而不是全等於null或""。(StringBuilder內部默認維護一個空字符串)
②返回請求,將響應的屬性實例化成一個對象。
請求對象包含:
其中狀態值必須用字典存放

由大至小,不管是在大流程的把握上,還是完善小的分支都要胸有成竹。要一直把控握著whole map。

17 思路打好後,要先做什麽?
打樁。

18 InputStream的read()方法返回的是什麽?
下一個字節,直到讀取完畢返回-1。

2017-9-7 - A - WebServer項目