【转载】Web简介
寫的非常好,建議直接進入原鏈接學習
https://mozillazg.com/2015/06/let-us-build-a-web-server-part-1-zh-cn.html
github link
讓我們一起來構建一個 Web 服務器(一)
2015-06-03
python let-us-build / server / http / lsbaws / 讓我們一起來構建一個 Web 服務器
本文譯自:http://ruslanspivak.com/lsbaws-part1/
有一天出去散步的時候,一個女人來到一處工地上,她看到有三個男人在工作。 她問第一個人,“你在做什么?“,第一個男人對這個問題感到非常的厭煩, 他大聲的說到”你沒看到我正在砌磚嗎?“女人對這個答案不大滿意, 她又去問第二個男人他在做什么。 第二個男人回答道,”我正在建造一面磚墻。” 然后,他把注意力轉向了第一個男人,他說道, “嘿,你只完成墻的尾部。你需要把最后那塊磚拿掉。” 仍舊不滿意這個答案,她又問第三個男人他在做什么。 這個男人邊望著天邊對他說, ”我正在建造世界上最大的教堂。“ 當他站在這里仰望著天空的時候,另外兩個男人開始爭吵應該怎么放磚。 這個男人轉向前面的兩個男人并說道, “嘿,伙計們,別擔心那塊磚了。那只是一塊內墻, 它將會被涂平沒人會看到那塊磚。 只需移動到另一層。” [1]
這則故事的寓意是當你了解了整個系統并且理解了不同的部分是如何組合在一起的時候(磚,墻,教堂), 你就可以更快的識別和解決問題(不正確的磚)。
對于從零開始創建我們自己的 Web server 來說需要做些什么呢?
我相信要成為一個優秀的開發者你必須更好的理解你日常使用的基礎軟件系統,包括編程語言,編譯器,解釋器,數據庫和操作系統,web server 和 web 框架。同時,為了更深入的理解整個系統,必須從零開始,一塊磚一面墻的重新構建它們
子曾經曰過:
“我聽到,我忘記。“
LSBAWS_confucius_hear.png
”我看到,我記住。“
LSBAWS_confucius_see.png
”我做到,我理解。“
LSBAWS_confucius_do.png
此刻,我希望你能深信通過重新構建一個不同的軟件系統來學習它們是如何工作的是一個好主意。
在這三篇系列中我將向你展示如何構建你自己的基礎的 Web server。讓我們開始吧。
先開始最重要的事情,什么是一個 Web server?
LSBAWS_HTTP_request_response.png
一言以蔽之,它是一個物理服務器上的一個網絡服務器(哎呀,一個服務器上的服務器)同時等待客戶端發送一個請求。 當它接收到一個請求的時候,它將生成一個響應并把它發送回客戶端。 客戶端和服務器的通信方式是使用的 HTTP 協議。 客戶端可以是你的瀏覽器或其他會說 HTTP 的任何軟件。
一個非常簡單的 Web server 實現長什么樣呢?我放了一個在這里。這個例子使用 Python 寫的,但是就算你不懂 Python(它是個非常容易學習的語言,你可以試一下!)你也能夠從下面的代碼和解釋中理解基本的概念:
import socket
HOST, PORT = ‘’, 8888
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print ‘Serving HTTP on port %s …’ % PORT
while True:
client_connection, client_address = listen_socket.accept()
request = client_connection.recv(1024)
print request
HTTP/1.1 200 OK
Hello, World!
“”"
client_connection.sendall(http_response)
client_connection.close()
將上面的代碼保存為 webserver1.py 或者直接從 GitHub 上下載下來,然后在命令行下像這樣運行:
$ python webserver1.py
Serving HTTP on port 8888 …
現在在你瀏覽器的地址欄中輸入如下鏈接 http://localhost:8888/hello ,按回車鍵然后就可以看到魔法效果了。 你應該會看到在你的瀏覽器中顯示 "Hello, World!” ,就像下面這樣:
browser_hello_world.png
放手去做吧,說真的。當你在測試的時候我會等你的。
做完了?非常好。現在讓我們討論一下它實際上是如何工作的。
首先讓我們從你輸入的 Web 地址開始。它被叫做 URL ,下面是它的基本結構:
LSBAWS_URL_Web_address.png
這就是你如何告訴你的瀏覽器它需要用來查找和連接的 Web server 地址以及需要顯示給你的位于服務器上的頁面(路徑)。 在你的瀏覽器發送一個 HTTP 請求前,它首先需要與 Web server 建立一條 TCP 連接。 然后再通過這個 TCP 連接發送一個 HTTP 請求到服務器,然后等待服務器發送回一個 HTTP 響應。 當你的瀏覽器接收到這個響應的時候,它就會顯示它。 在這里它將顯示 “Hello, World!”
讓我們更詳細的探索一下客戶端和服務器在發送 HTTP 請求和響應之前是如何建立一條 TCP 連接的。 為了達到這個目的,它們都使用了所謂的 sockets 。 為了代替瀏覽器直連,你可以通過在命令行上使用 telnet 命令的方式來手動模擬瀏覽器的行為。
在你運行 Web server 的電腦上打開一個 telnet 會話,可以通過在命令行上輸入 telent 并指定連接到 localhost 這個主機和 8888 這個端口,然后按下回車鍵:
$ telnet localhost 8888
Trying 127.0.0.1 …
Connected to localhost.
此刻,你已經與運行在你的本地機器上的準備發送和接收 HTTP 消息的服務器建立了一條 TCP 連接。 在下面的圖片中你將看到一套標準的程序,服務器必須遵守這套程序以便能夠接受新的 TCP 連接。
LSBAWS_socket.png
在相同的 telnet 會話中輸入 GET /hello HTTP/1.1 然后按下回車鍵:
$ telnet localhost 8888
Trying 127.0.0.1 …
Connected to localhost.
GET /hello HTTP/1.1
HTTP/1.1 200 OK
Hello, World!
你剛剛手動模擬了你的瀏覽器!你發送了一個 HTTP 請求并收到了一個 HTTP 響應。 下面是一個基本的 HTTP 請求的結構:
LSBAWS_HTTP_request_anatomy.png
HTTP 請求包含了一個表示 HTTP 方法的行(GET, 因為我們要求我們的服務器返回我們一下東西), 路徑 /hello 表示了服務器上一個我們需要的”頁面“,以及協議版本。
為了簡單起見,我們的 Web server 在這里完全忽略了上面提到的請求行。 你可以用任何垃圾數據代替 ”GET /hello HTTP/1.1“,你依然可以得到一個內容為 ”Hello, World!“ 的響應。
一旦你輸入完請求行并按下回車鍵,客戶端就會把請求發送到服務器,服務器讀取請求行,打印出來,并返回合適的 HTTP 響應。
下面是 server 發送回你的客戶端(在這里是 telnet)的 HTTP 響應:
LSBAWS_HTTP_response_anatomy.png
讓我們來分析一下。響應包括一個狀態行 HTTP/1.1 200 OK, 接下來是一個空行,然后是 HTTP 響應的 body 。
response 狀態行 HTTP/1.1 200 OK 包括了 HTTP 版本,HTTP 狀態碼 以及 HTTP 狀態碼原因詞組 OK。 當瀏覽器獲取到響應時,它將顯示響應的 body 部分,這就是為什么你能在你的瀏覽器中看到 “Hello, World!” 的原因。
這就是一個 Web server 如何工作的基本模型了。總結一下: Web server 創建一個 socket 監聽并開始在一個循環里接受新的連接。客戶端啟動一個 TCP 連接,成功建立連接之后客戶端發送一個 HTTP 請求到 server ,然后 server 響應一個展示給用戶的 HTTP response 。客戶端和服務器都使用 socket 來建立 TCP 連接。
現在你已經有一個非常基礎的 Web server 了,你可以用你的瀏覽器或其他的 HTTP 客戶端來測試它。 正如你見過的,如果想嘗試的話你也可以通過使用 telent 手動輸入 HTTP 請求的方式成為一個人肉 HTTP 客戶端。
有個問題要問你:“如何在你這個新鮮出爐的 Web server 上運行一個 Django 應用, Flask 應用,以及 Pyramid 應用,并且不需要做任何的改動就可以適應這些不同的 Web 框架?”
我將在 第二篇文章 中向你詳細的講解。敬請期待。
[1] 靈感來自 Lead with a Story: A Guide to Crafting Business Narratives That Captivate, Convince, and Inspire
總結
- 上一篇: 【转载】常用DOS命令(包括创建删除文件
- 下一篇: MAC下载Linux Centos镜像文