mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-03-27 02:30:10 +08:00
PUB:20160309 Let’s Build A Web Server. Part 1
@StdioA 翻译的不错,轻松诙谐。继续加油将本系列搞定!
This commit is contained in:
parent
d0189a1cc5
commit
d34a8f088d
@ -1,4 +1,4 @@
|
||||
搭个 Web 服务器:第一部分
|
||||
搭个 Web 服务器(一)
|
||||
=====================================
|
||||
|
||||
一天,有一个正在散步的妇人恰好路过一个建筑工地,看到三个正在工作的工人。她问第一个人:“你在做什么?”第一个人没好气地喊道:“你没看到我在砌砖吗?”妇人对这个答案不满意,于是问第二个人:“你在做什么?”第二个人回答说:“我在建一堵砖墙。”说完,他转向第一个人,跟他说:“嗨,你把墙砌过头了。去把刚刚那块砖弄下来!”然而,妇人对这个答案依然不满意,于是又问了第三个人相同的问题。第三个人仰头看着天,对她说:“我在建造世界上最大的教堂。”当他回答时,第一个人和第二个人在为刚刚砌错的砖而争吵。他转向那两个人,说:“不用管那块砖了。这堵墙在室内,它会被水泥填平,没人会看见它的。去砌下一层吧。”
|
||||
@ -9,17 +9,17 @@
|
||||
|
||||
我相信,如果你想成为一个更好的开发者,你**必须**对日常使用的软件系统的内部结构有更深的理解,包括编程语言、编译器与解释器、数据库及操作系统、Web 服务器及 Web 框架。而且,为了更好更深入地理解这些系统,你**必须**从头开始,用一砖一瓦来重新构建这个系统。
|
||||
|
||||
孔子曾经用这几句话来表达这种思想:
|
||||
荀子曾经用这几句话来表达这种思想:
|
||||
|
||||
>“不闻不若闻之。”
|
||||
>“不闻不若闻之。(I hear and I forget.)”
|
||||
|
||||

|
||||
|
||||
>“闻之不若见之。”
|
||||
>“闻之不若见之。(I see and I remember.)”
|
||||
|
||||

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

|
||||
|
||||
@ -59,7 +59,7 @@ Hello, World!
|
||||
client_connection.close()
|
||||
```
|
||||
|
||||
将以上代码保存为 webserver1.py,或者直接从 GitHub 上下载这个文件。然后,在命令行中运行这个程序。像这样:
|
||||
将以上代码保存为 webserver1.py,或者直接从 [GitHub][1] 上下载这个文件。然后,在命令行中运行这个程序。像这样:
|
||||
|
||||
```
|
||||
$ python webserver1.py
|
||||
@ -72,15 +72,15 @@ Serving HTTP on port 8888 …
|
||||
|
||||
说真的,快去试一试。你做实验的时候,我会等着你的。
|
||||
|
||||
完成了?不错。现在我们来讨论一下它实际上是怎么工作的。
|
||||
完成了?不错!现在我们来讨论一下它实际上是怎么工作的。
|
||||
|
||||
首先我们从你刚刚输入的 Web 地址开始。它叫 URL,这是它的基本结构:
|
||||
首先我们从你刚刚输入的 Web 地址开始。它叫 [URL][2],这是它的基本结构:
|
||||
|
||||

|
||||
|
||||
URL 是一个 Web 服务器的地址,浏览器用这个地址来寻找并连接 Web 服务器,并将上面的内容返回给你。在你的浏览器能够发送 HTTP 请求之前,它需要与 Web 服务器建立一个 TCP 连接。然后会在 TCP 连接中发送 HTTP 请求,并等待服务器返回 HTTP 响应。当你的浏览器收到响应后,就会显示其内容,在上面的例子中,它显示了“Hello, World!”。
|
||||
|
||||
我们来进一步探索在发送 HTTP 请求之前,客户端与服务器建立 TCP 连接的过程。为了建立链接,它们使用了所谓“套接字”。我们现在不直接使用浏览器发送请求,而在命令行中使用 telnet 来人工模拟这个过程。
|
||||
我们来进一步探索在发送 HTTP 请求之前,客户端与服务器建立 TCP 连接的过程。为了建立链接,它们使用了所谓“套接字(socket)”。我们现在不直接使用浏览器发送请求,而在命令行中使用 `telnet` 来人工模拟这个过程。
|
||||
|
||||
在你运行 Web 服务器的电脑上,在命令行中建立一个 telnet 会话,指定一个本地域名,使用端口 8888,然后按下回车:
|
||||
|
||||
@ -94,7 +94,7 @@ Connected to localhost.
|
||||
|
||||

|
||||
|
||||
在同一个 telnet 会话中,输入 GET /hello HTTP/1.1,然后输入回车:
|
||||
在同一个 telnet 会话中,输入 `GET /hello HTTP/1.1`,然后输入回车:
|
||||
|
||||
```
|
||||
$ telnet localhost 8888
|
||||
@ -106,11 +106,11 @@ HTTP/1.1 200 OK
|
||||
Hello, World!
|
||||
```
|
||||
|
||||
你刚刚手动模拟了你的浏览器!你发送了 HTTP 请求,并且收到了一个 HTTP 应答。下面是一个 HTTP 请求的基本结构:
|
||||
你刚刚手动模拟了你的浏览器(的工作)!你发送了 HTTP 请求,并且收到了一个 HTTP 应答。下面是一个 HTTP 请求的基本结构:
|
||||
|
||||

|
||||
|
||||
HTTP 请求的第一行由三部分组成:HTTP 方法(GET,因为我们想让我们的服务器返回一些内容),以及标明所需页面的路径 /hello,还有协议版本。
|
||||
HTTP 请求的第一行由三部分组成:HTTP 方法(`GET`,因为我们想让我们的服务器返回一些内容),以及标明所需页面的路径 `/hello`,还有协议版本。
|
||||
|
||||
为了简单一些,我们刚刚构建的 Web 服务器完全忽略了上面的请求内容。你也可以试着输入一些无用内容而不是“GET /hello HTTP/1.1”,但你仍然会收到一个“Hello, World!”响应。
|
||||
|
||||
@ -120,19 +120,19 @@ HTTP 请求的第一行由三部分组成:HTTP 方法(GET,因为我们想
|
||||
|
||||

|
||||
|
||||
我们来解析它。这个响应由三部分组成:一个状态行 HTTP/1.1 200 OK,后面跟着一个空行,再下面是响应正文。
|
||||
我们来解析它。这个响应由三部分组成:一个状态行 `HTTP/1.1 200 OK`,后面跟着一个空行,再下面是响应正文。
|
||||
|
||||
HTTP 响应的状态行 HTTP/1.1 200 OK 包含 HTTP 版本号,HTTP 状态码以及 HTTP 状态短语“OK”。当浏览器收到响应后,它会将响应正文显示出来,这也就是为什么你会在浏览器中看到“Hello, World!”。
|
||||
HTTP 响应的状态行 HTTP/1.1 200 OK 包含了 HTTP 版本号,HTTP 状态码以及 HTTP 状态短语“OK”。当浏览器收到响应后,它会将响应正文显示出来,这也就是为什么你会在浏览器中看到“Hello, World!”。
|
||||
|
||||
以上就是 Web 服务器的基本工作模型。总结一下:Web 服务器创建一个处于监听状态的套接字,循环接收新的连接。客户端建立 TCP 连接成功后,会向服务器发送 HTTP 请求,然后服务器会以一个 HTTP 响应做应答,客户端会将 HTTP 的响应内容显示给用户。为了建立 TCP 连接,客户端和服务端均会使用套接字。
|
||||
|
||||
现在,你应该了解了 Web 服务器的基本工作方式,你可以使用浏览器或其它 HTTP 客户端进行试验。如果你尝试过、观察过,你应该也能够使用 telnet,人工编写 HTTP 请求,成为一个人形 HTTP 客户端。
|
||||
现在,你应该了解了 Web 服务器的基本工作方式,你可以使用浏览器或其它 HTTP 客户端进行试验。如果你尝试过、观察过,你应该也能够使用 telnet,人工编写 HTTP 请求,成为一个“人形” HTTP 客户端。
|
||||
|
||||
现在留一个小问题:“你要如何在不对程序做任何改动的情况下,在你刚刚搭建起来的 Web 服务器上适配 Django, Flask 或 Pyramid 应用呢?
|
||||
现在留一个小问题:“你要如何在不对程序做任何改动的情况下,在你刚刚搭建起来的 Web 服务器上适配 Django, Flask 或 Pyramid 应用呢?”
|
||||
|
||||
我会在本系列的第二部分中来详细讲解。敬请期待。
|
||||
|
||||
顺便,我在撰写《搭个 Web 服务器:从头开始》。这本书讲解了如何从头开始编写一个基本的 Web 服务器,里面包含本文中没有的更多细节。订阅邮件列表,你就可以获取到这本书的最新进展,以及发布日期。
|
||||
顺便,我在撰写一本名为《搭个 Web 服务器:从头开始》的书。这本书讲解了如何从头开始编写一个基本的 Web 服务器,里面包含本文中没有的更多细节。订阅邮件列表,你就可以获取到这本书的最新进展,以及发布日期。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -140,11 +140,11 @@ via: https://ruslanspivak.com/lsbaws-part1/
|
||||
|
||||
作者:[Ruslan][a]
|
||||
译者:[StdioA](https://github.com/StdioA)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://linkedin.com/in/ruslanspivak/
|
||||
|
||||
|
||||
[1]: https://github.com/rspivak/lsbaws/blob/master/part1/webserver1.py
|
||||
[2]: http://en.wikipedia.org/wiki/Uniform_resource_locator
|
||||
|
Loading…
Reference in New Issue
Block a user