先在文章前面說好了,省得大家發現我根本沒有這樣的頭發,duang的一下一堆人罵我。
這篇文章的標題有點大,其實挺low的,我需要在開頭解釋一下。我這里只想寫一個小的控制臺,旨在模擬瀏覽器的http通信。
不是真的能用的瀏覽器。
簡單的說,今天的全部工作就是
建立Socket→發送請求報文→ 服務器返回報文→顯示報文。僅此而已喏。
實話說出來,是不是一下就low了?
我的目的只有兩個。 1.加深對http協議的理解 2.深化對B/S結構的認識。
如果您已經非常了解這些東西了。那就甭搭理我,讓我自娛自樂一會就好了。
1.http工作原理
上一篇文章介紹了,http協議的運行機制,簡單的說就是這樣一張圖。
2.瀏覽器工作原理
根據這個運行機制,我猜測瀏覽器的工作原理應該是這樣的。
當然,這個原理圖里,我刻意的忽略了瀏覽器 解釋javascript的能力、緩存管理的能力等等......
主要原因是,都考慮進去圖就太復雜了。背離了我們研究http協議,理解B/S模式的初衷。
當然了,根本原因是,我不會! (突然好悲傷啊。。。不說了,我先哭一會)
1.思路
思路沒什么好說的就是上面那張圖。
建立Socket→發送請求報文→ 服務器返回報文→顯示報文。
2.代碼
1 /* 2 這個程序把主機地址寫死了, 3 想更像的話,可以在加個輸入。然后根據輸入的url獲取 響應報文。 4 */ 5 6 Socket socket = new Socket(SocketType.Stream, PRotocolType.Tcp); 7 //連接服務器。http協議默認的端口號是80。每個服務器軟件監聽一個端口(別的軟件就不能監聽這個端口了),發送給這個端口的數據只會被這個服務器軟件接收到。 8 socket.Connect(new DnsEndPoint("127.0.0.1", 8080)); 9 //讀寫socket通訊數據的流10 using (NetworkStream netStream = new NetworkStream(socket))11 using (StreamWriter writer = new StreamWriter(netStream))12 {13 //這里就是寫之前 講的請求報文,偷點懶,不多寫了14 writer.WriteLine("GET /index.html HTTP/1.1");15 writer.WriteLine("Host: 127.0.0.1:8080");16 //空行回車,表示指令結束17 //還記得http請求報文格式嗎?報文頭和報文體之間用一個空行回車隔開。18 writer.WriteLine();19 }20 //開始讀嘍21 using (NetworkStream netStream = new NetworkStream(socket))22 using (StreamReader reader = new StreamReader(netStream))23 {24 string line;25 while ((line = reader.ReadLine())!=null)26 {27 //讀一行輸出一行28 Console.WriteLine(line); 29 }30 }31 //幾個釋放資源32 socket.Disconnect(false);
1.預期效果
沒錯,這就是瀏覽器請求IIS歡迎頁面的響應報文。如果我們的控制臺能輸出一樣的響應報文,證明實驗成功了!!
2.調試結果
新聞熱點
疑難解答