偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何搭建 Web 服務(wù)器(一)

開發(fā) 架構(gòu)
如果你想成為一個(gè)更好的開發(fā)者,你必須對(duì)日常使用的軟件系統(tǒng)的內(nèi)部結(jié)構(gòu)有更深的理解,包括編程語言、編譯器與解釋器、數(shù)據(jù)庫(kù)及操作系統(tǒng)、Web 服務(wù)器及 Web 框架。而且,為了更好更深入地理解這些系統(tǒng),你必須從頭開始,用一磚一瓦來重新構(gòu)建這個(gè)系統(tǒng)。

 [[169747]]

一天,有一個(gè)正在散步的婦人恰好路過一個(gè)建筑工地,看到三個(gè)正在工作的工人。她問***個(gè)人:“你在做什么?”***個(gè)人沒好氣地喊道:“你沒看到我在砌磚嗎?”婦人對(duì)這個(gè)答案不滿意,于是問第二個(gè)人:“你在做什么?”第二個(gè)人回答說:“我在建一堵磚墻。”說完,他轉(zhuǎn)向***個(gè)人,跟他說:“嗨,你把墻砌過頭了。去把剛剛那塊磚弄下來!”然而,婦人對(duì)這個(gè)答案依然不滿意,于是又問了第三個(gè)人相同的問題。第三個(gè)人仰頭看著天,對(duì)她說:“我在建造世界上***的教堂。”當(dāng)他回答時(shí),***個(gè)人和第二個(gè)人在為剛剛砌錯(cuò)的磚而爭(zhēng)吵。他轉(zhuǎn)向那兩個(gè)人,說:“不用管那塊磚了。這堵墻在室內(nèi),它會(huì)被水泥填平,沒人會(huì)看見它的。去砌下一層吧。”

這個(gè)故事告訴我們:如果你能夠理解整個(gè)系統(tǒng)的構(gòu)造,了解系統(tǒng)的各個(gè)部件如何相互結(jié)合(如磚、墻還有整個(gè)教堂),你就能夠更快地定位及修復(fù)問題(那塊砌錯(cuò)的磚)。

如果你想從頭開始創(chuàng)造一個(gè) Web 服務(wù)器,那么你需要做些什么呢?

我相信,如果你想成為一個(gè)更好的開發(fā)者,你必須對(duì)日常使用的軟件系統(tǒng)的內(nèi)部結(jié)構(gòu)有更深的理解,包括編程語言、編譯器與解釋器、數(shù)據(jù)庫(kù)及操作系統(tǒng)、Web 服務(wù)器及 Web 框架。而且,為了更好更深入地理解這些系統(tǒng),你必須從頭開始,用一磚一瓦來重新構(gòu)建這個(gè)系統(tǒng)。

荀子曾經(jīng)用這幾句話來表達(dá)這種思想:

“不聞不若聞之。(I hear and I forget.)”

 

“聞之不若見之。(I see and I remember.)”

 

“知之不若行之。(I do and I understand.)”

 

我希望你現(xiàn)在能夠意識(shí)到,重新建造一個(gè)軟件系統(tǒng)來了解它的工作方式是一個(gè)好主意。

在這個(gè)由三篇文章組成的系列中,我將會(huì)教你構(gòu)建你自己的 Web 服務(wù)器。我們開始吧~

先說首要問題:Web 服務(wù)器是什么?

 

簡(jiǎn)而言之,它是一個(gè)運(yùn)行在一個(gè)物理服務(wù)器上的網(wǎng)絡(luò)服務(wù)器(啊呀,服務(wù)器套服務(wù)器),等待客戶端向其發(fā)送請(qǐng)求。當(dāng)它接收請(qǐng)求后,會(huì)生成一個(gè)響應(yīng),并回送至客戶端。客戶端和服務(wù)端之間通過 HTTP 協(xié)議來實(shí)現(xiàn)相互交流??蛻舳丝梢允悄愕臑g覽器,也可以是使用 HTTP 協(xié)議的其它任何軟件。

最簡(jiǎn)單的 Web 服務(wù)器實(shí)現(xiàn)應(yīng)該是什么樣的呢?這里我給出我的實(shí)現(xiàn)。這個(gè)例子由 Python 寫成,即使你沒聽說過 Python(它是一門超級(jí)容易上手的語言,快去試試看!),你也應(yīng)該能夠從代碼及注釋中理解其中的理念:

  1. import socket 
  2. HOST, PORT = '', 8888 
  3. listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  4. listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
  5. listen_socket.bind((HOST, PORT)) 
  6. listen_socket.listen(1) 
  7. print 'Serving HTTP on port %s ...' % PORT 
  8. while True
  9.     client_connection, client_address = listen_socket.accept() 
  10.     request = client_connection.recv(1024) 
  11.     print request 
  12.     http_response = """\ 
  13. HTTP/1.1 200 OK 
  14. Hello, World! 
  15. ""
  16.     client_connection.sendall(http_response) 
  17.     client_connection.close() 

將以上代碼保存為 webserver1.py,或者直接從 GitHub 上下載這個(gè)文件。然后,在命令行中運(yùn)行這個(gè)程序。像這樣:

  1. $ python webserver1.py 
  2. Serving HTTP on port 8888 … 

現(xiàn)在,在你的網(wǎng)頁(yè)瀏覽器的地址欄中輸入 URL:http://localhost:8888/hello ,敲一下回車,然后來見證奇跡。你應(yīng)該看到“Hello, World!”顯示在你的瀏覽器中,就像下圖那樣:

 

說真的,快去試一試。你做實(shí)驗(yàn)的時(shí)候,我會(huì)等著你的。

完成了?不錯(cuò)!現(xiàn)在我們來討論一下它實(shí)際上是怎么工作的。

首先我們從你剛剛輸入的 Web 地址開始。它叫 URL,這是它的基本結(jié)構(gòu):

 

URL 是一個(gè) Web 服務(wù)器的地址,瀏覽器用這個(gè)地址來尋找并連接 Web 服務(wù)器,并將上面的內(nèi)容返回給你。在你的瀏覽器能夠發(fā)送 HTTP 請(qǐng)求之前,它需要與 Web 服務(wù)器建立一個(gè) TCP 連接。然后會(huì)在 TCP 連接中發(fā)送 HTTP 請(qǐng)求,并等待服務(wù)器返回 HTTP 響應(yīng)。當(dāng)你的瀏覽器收到響應(yīng)后,就會(huì)顯示其內(nèi)容,在上面的例子中,它顯示了“Hello, World!”。

我們來進(jìn)一步探索在發(fā)送 HTTP 請(qǐng)求之前,客戶端與服務(wù)器建立 TCP 連接的過程。為了建立鏈接,它們使用了所謂“套接字socket”。我們現(xiàn)在不直接使用瀏覽器發(fā)送請(qǐng)求,而在命令行中使用 telnet 來人工模擬這個(gè)過程。

在你運(yùn)行 Web 服務(wù)器的電腦上,在命令行中建立一個(gè) telnet 會(huì)話,指定一個(gè)本地域名,使用端口 8888,然后按下回車:

  1. $ telnet localhost 8888 
  2. Trying 127.0.0.1 … 
  3. Connected to localhost. 

這個(gè)時(shí)候,你已經(jīng)與運(yùn)行在你本地主機(jī)的服務(wù)器建立了一個(gè) TCP 連接。在下圖中,你可以看到一個(gè)服務(wù)器從頭開始,到能夠建立 TCP 連接的基本過程。

 

在同一個(gè) telnet 會(huì)話中,輸入 GET /hello HTTP/1.1,然后輸入回車:

  1. $ telnet localhost 8888 
  2. Trying 127.0.0.1 … 
  3. Connected to localhost. 
  4. GET /hello HTTP/1.1 
  5. HTTP/1.1 200 OK 
  6. Hello, World! 

你剛剛手動(dòng)模擬了你的瀏覽器(的工作)!你發(fā)送了 HTTP 請(qǐng)求,并且收到了一個(gè) HTTP 應(yīng)答。下面是一個(gè) HTTP 請(qǐng)求的基本結(jié)構(gòu):

 

HTTP 請(qǐng)求的***行由三部分組成:HTTP 方法(GET,因?yàn)槲覀兿胱屛覀兊姆?wù)器返回一些內(nèi)容),以及標(biāo)明所需頁(yè)面的路徑/hello,還有協(xié)議版本。

為了簡(jiǎn)單一些,我們剛剛構(gòu)建的 Web 服務(wù)器完全忽略了上面的請(qǐng)求內(nèi)容。你也可以試著輸入一些無用內(nèi)容而不是“GET /hello HTTP/1.1”,但你仍然會(huì)收到一個(gè)“Hello, World!”響應(yīng)。

一旦你輸入了請(qǐng)求行并敲了回車,客戶端就會(huì)將請(qǐng)求發(fā)送至服務(wù)器;服務(wù)器讀取請(qǐng)求行,就會(huì)返回相應(yīng)的 HTTP 響應(yīng)。

下面是服務(wù)器返回客戶端(在上面的例子里是 telnet)的響應(yīng)內(nèi)容:

 

我們來解析它。這個(gè)響應(yīng)由三部分組成:一個(gè)狀態(tài)行 HTTP/1.1 200 OK,后面跟著一個(gè)空行,再下面是響應(yīng)正文。

HTTP 響應(yīng)的狀態(tài)行 HTTP/1.1 200 OK 包含了 HTTP 版本號(hào),HTTP 狀態(tài)碼以及 HTTP 狀態(tài)短語“OK”。當(dāng)瀏覽器收到響應(yīng)后,它會(huì)將響應(yīng)正文顯示出來,這也就是為什么你會(huì)在瀏覽器中看到“Hello, World!”。

以上就是 Web 服務(wù)器的基本工作模型??偨Y(jié)一下:Web 服務(wù)器創(chuàng)建一個(gè)處于監(jiān)聽狀態(tài)的套接字,循環(huán)接收新的連接??蛻舳私?TCP 連接成功后,會(huì)向服務(wù)器發(fā)送 HTTP 請(qǐng)求,然后服務(wù)器會(huì)以一個(gè) HTTP 響應(yīng)做應(yīng)答,客戶端會(huì)將 HTTP 的響應(yīng)內(nèi)容顯示給用戶。為了建立 TCP 連接,客戶端和服務(wù)端均會(huì)使用套接字。

現(xiàn)在,你應(yīng)該了解了 Web 服務(wù)器的基本工作方式,你可以使用瀏覽器或其它 HTTP 客戶端進(jìn)行試驗(yàn)。如果你嘗試過、觀察過,你應(yīng)該也能夠使用 telnet,人工編寫 HTTP 請(qǐng)求,成為一個(gè)“人形” HTTP 客戶端。

現(xiàn)在留一個(gè)小問題:“你要如何在不對(duì)程序做任何改動(dòng)的情況下,在你剛剛搭建起來的 Web 服務(wù)器上適配 Django, Flask 或 Pyramid 應(yīng)用呢?”

我會(huì)在本系列的第二部分中來詳細(xì)講解。敬請(qǐng)期待。

順便,我在撰寫一本名為《搭個(gè) Web 服務(wù)器:從頭開始》的書。這本書講解了如何從頭開始編寫一個(gè)基本的 Web 服務(wù)器,里面包含本文中沒有的更多細(xì)節(jié)。訂閱郵件列表,你就可以獲取到這本書的***進(jìn)展,以及發(fā)布日期。

如何搭建 Web 服務(wù)器(二)

責(zé)任編輯:龐桂玉 來源: Linux中國(guó)
相關(guān)推薦

2016-10-11 12:45:50

PythonWeb服務(wù)器

2016-08-22 20:37:10

PythonWeb服務(wù)器

2017-10-19 16:12:57

2022-02-22 11:57:32

BOAWeb服務(wù)器

2016-11-02 13:33:43

2019-05-08 14:37:49

Web服務(wù)器HTTP

2018-04-02 15:07:01

LinuxApacheWeb服務(wù)器

2009-02-09 18:02:00

2010-05-25 09:32:04

搭建SVN服務(wù)器

2014-09-18 10:15:54

2018-08-07 08:54:18

2013-12-04 09:17:45

2012-03-22 10:35:20

CentOSWeb服務(wù)器

2019-02-15 10:49:37

Node.jsweb服務(wù)器

2012-03-15 09:38:31

openSUSE 12Web服務(wù)器

2019-04-24 15:13:16

Web服務(wù)器應(yīng)用服務(wù)器Web容器

2011-08-08 14:31:49

服務(wù)器

2017-12-27 10:18:09

ApacheNginx服務(wù)器

2011-03-17 14:07:39

2020-04-15 20:57:57

NginxWeb服務(wù)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)