理解web服務(wù)器端處理流程基本原理
為了簡單理解web的運(yùn)行流程朝捆,看了不少博客特此總結(jié)。 首先是最簡單的一個web服務(wù)器是如何工作的义起;上完計算機(jī)網(wǎng)絡(luò)課程之后我們應(yīng)該學(xué)會了操作簡單的socket睛琳;包括基本的服務(wù)器端綁定端口監(jiān)聽,接收最基本的字符串消息做出響應(yīng)以及客戶端請求連接接奈,發(fā)送字符串;
ServerSocketserver=newServerSocket(port);
Socketsocket=server.accept();
InputStreaminputStream=socket.getInputStream();
那么這些基礎(chǔ)操作怎么變成我們所了解的龐大服務(wù)器的呢通孽?參考《How Tomcat Work》的第一份代碼我們可以實(shí)現(xiàn)通過瀏覽器打開第一個靜態(tài)頁面的服務(wù)器序宦;
原理就在于瀏覽器請求會發(fā)送一系列協(xié)議內(nèi)容的socket字符串,這些字符串的意義暫時沒需要的話就不用管背苦,但是我們的服務(wù)器需要對這些進(jìn)行解析互捌; 瀏覽器發(fā)送的socket字符串如下(就是純socket接收的字符串,沒有什么高級的東西)
我們唯一關(guān)注的就是GET后面的“/”(GET / HTTP/1.1)表示請求的路徑為 /root路徑行剂,服務(wù)器可以默認(rèn)返回index.html秕噪。
詳細(xì)步驟:從接收這些請求字符串這個過程大致有兩步:(代碼來自《how tomcat work》)
1. 解析請求,搞清瀏覽器要請求什么
對于請求index.html厚宰,我們在瀏覽器輸入localhost:port/index.html后,我們的簡易版服務(wù)器直接通過parse()函數(shù)解析腌巾,邏輯如下:
public void parse() {
// 初始化一個stringbuffer
StringBuffer request = new StringBuffer(2048);
int i;
byte[] buffer = new byte[2048];
try {
i = input.read(buffer);
}
catch (IOException e) {
e.printStackTrace();
i = -1;
}
//將請求放入buffer
for (int j=0; j<i; j++) {
request.append((char) buffer[j]);
}
System.out.print(request.toString());
//真正的解析邏輯
uri = parseUri(request.toString());
}
private String parseUri(String requestString) {
int index1, index2;
//重點(diǎn)就是找到第一行第一個空格所在地方 如GET /index.html HTTP/1.1
index1 = requestString.indexOf(' ');
if (index1 != -1) {
//找到第二個空格;那么兩個空格中間就是我們要請求的資源名
index2 = requestString.indexOf(' ', index1 + 1);
if (index2 > index1)
//解析返回 “index.html”
return requestString.substring(index1 + 1, index2);
}
return null;
}
這么一來服務(wù)器就用我們初學(xué)者都會的字符串解析獲取了瀏覽器的請求內(nèi)容標(biāo)題:index.html
2.找到對應(yīng)資源并寫入輸出流
接下來就去找文件“index.html”铲觉,沒啥好說的澈蝙,把一個文件打開讀取內(nèi)容到輸出流這類操作隨時都可以搜索到,直接加一堆http中我們暫時用不著的頭撵幽,發(fā)送給瀏覽器碉克;
大功告成: