专栏首页编程用python搭个web服务器玩玩(一)

用python搭个web服务器玩玩(一)

如果你想成为一个优秀的开发者,你应该对日常使用的软件系统的内部结构有深入的理解,包括编程语言、数据库及操作系统、Web 服务器及 Web 框架。而且,为了更好更深入地理解这些系统,你应当从头开始,用一砖一瓦来重新构建这个系统。

web服务器是什么

要构建自己的web服务器,首先要知道Web 服务器是什么?下面就是一个典型的web服务器,相信大家在生活中都使用过:

简而言之,web服务器是一个运行的网络服务器(也就是一个软件),等待客户端向其发送请求。当它接收请求后,会生成响应,并回送至客户端。客户端和服务端之间通过 HTTP 协议来实现相互交流。客户端可以是你的浏览器,也可以是使用 HTTP 协议的其它任何软件,其实,在你看这篇公众号文章的时候,使用的就是web服务器提供的服务。

一个简单的web服务器实现

商用web服务器是很复杂的,动辄几十万行代码是很常见的,但是它也可以很简单,简单到几十行代码就能搞定。不信,看Ruslan先生的第一版web服务器代码。这个例子由 Python 写成,即使你没听说过 Python(它是一门超级容易上手的语言,快去试试看!),你也应该能够从代码及注释中理解其中的理念:

importsocket

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

whileTrue: client_connection, client_address=listen_socket.accept() request=client_connection.recv(1024)

printrequest http_response="""\

HTTP/1.1 200 OK

Hello, World!"""client_connection.sendall(http_response) client_connection.close()

将以上代码保存为 webserver1.py,然后,在命令行中运行这个程序。像这样:

$ python webserver1.py

Serving HTTP on port8888...

现在,在你的网页浏览器的地址栏中输入 URL:http://localhost:8888/hello,敲一下回车,然后来见证奇迹。你应该看到“Hello, World!”显示在你的浏览器中,就像下图那样:

web服务器工作流程

现在我们来讨论一下它实际上是怎么工作的。首先我们从你刚刚输入的 Web 地址开始。它叫URL,这是它的基本结构:

URL 是一个 Web 服务器的地址,浏览器用这个地址来寻找并连接 Web 服务器,并将上面的内容返回给你。在你的浏览器能够发送 HTTP 请求之前,它需要与 Web 服务器建立一个 TCP 连接。然后会在TCP 连接中发送 HTTP 请求,并等待服务器返回 HTTP 响应。当你的浏览器收到响应后,就会显示其内容,在上面的例子中,它显示了“Hello, World!”。

我们来进一步探索在发送 HTTP 请求之前,客户端与服务器建立 TCP 连接的过程。为了建立链接,它们使用了socket(套接字)。我们现在不直接使用浏览器发送请求,而在命令行中用来人工模拟这个过程。

在你运行 Web 服务器的电脑上,在命令行中建立一个 telnet 会话,指定一个本地域名,使用端口 8888,然后按下回车:

$ telnet localhost8888

Trying127.0.0.1...

Connected to localhost.

这个时候,你已经与运行在你本地主机的服务器建立了一个 TCP 连接。在下图中,你可以看到一个服务器从头开始,到能够建立 TCP 连接的基本过程。

在同一个 telnet 会话中,输入,然后输入回车:

$ telnet localhost8888

Trying127.0.0.1...Connected to localhost.

GET/hello HTTP/1.1

HTTP/1.1200OK

Hello, World!

你刚刚手动模拟了你的浏览器(的工作)!你发送了 HTTP 请求,并且收到了一个 HTTP 应答。下面是一个 HTTP 请求的基本结构:

HTTP 请求的第一行由三部分组成:HTTP 方法(,因为我们想让我们的服务器返回一些内容),以及标明所需页面的路径,还有协议版本。

为了简单一些,我们刚刚构建的 Web 服务器完全忽略了上面的请求内容。你也可以试着输入一些无用内容而不是“GET /hello HTTP/1.1”,但你仍然会收到一个“Hello, World!”响应。

一旦你输入了请求行并敲了回车,客户端就会将请求发送至服务器;服务器读取请求行,就会返回相应的 HTTP 响应。

下面是服务器返回客户端(在上面的例子里是 telnet)的响应内容:

这个响应由三部分组成:一个状态行,后面跟着一个空行,再下面是响应正文。

HTTP 响应的状态行HTTP/1.1 200 OK包含了HTTP 版本号,HTTP 状态码200以及HTTP 状态短语“OK”。当浏览器收到响应后,它会将响应正文显示出来,这也就是为什么你会在浏览器中看到“Hello, World!”。

以上就是 Web 服务器的基本工作模型。总结一下:Web 服务器创建一个处于监听状态的套接字,循环接收新的连接。客户端建立 TCP 连接成功后,会向服务器发送 HTTP 请求,然后服务器会以一个 HTTP 响应做应答,客户端会将 HTTP 的响应内容显示给用户。为了建立 TCP 连接,客户端和服务端均会使用套接字。

现在,你应该了解了 Web 服务器的基本工作方式,你可以使用浏览器或其它 HTTP 客户端进行试验。如果你尝试过、观察过,你应该也能够使用 telnet,人工编写 HTTP 请求,成为一个“人形” HTTP 客户端。

现在留一个小问题:“你要如何在不对程序做任何改动的情况下,在你刚刚搭建起来的 Web 服务器上适配 Django, Flask 或 Pyramid 应用呢?”将在本系列的第二部分中来详细讲解。

本文来自企鹅号 - 码农有道媒体

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 用不到 100 行的 Golang 代码实现 HTTP 代理

    我们的目标是实现一个能处理 HTTP 和 HTTPS 的代理服务器。代理 HTTP 请求的过程其实就是一个解析请求、将该请求转发到目的服务器、读取目的服务器响应...

    企鹅号小编
  • 浅析负载均衡的6种算法,Ngnix的5种算法

    常见的几种负载均衡算法 ? 1、轮询法 将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。 2、...

    企鹅号小编
  • 杰和科技郑茹冰:2018服务器市场的新动能与新机遇

    至顶网报道 当今的服务器市场正在迎来“新时代”的变革期,云计算、大数据、人工智能等技术对于服务器的产品形态产生了巨大的影响。在低迷一段时间后,服务器市场在迎来新...

    企鹅号小编
  • http 协议 详解

      协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从...

    小蔚
  • hdu------(1525)Euclid's Game(博弈决策树)

    Euclid's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3276...

    Gxjun
  • 如何快速搭建 Discuz! 论坛

    Discuz!全称:Crossday Discuz! Board,是一套免费使用的社区论坛软件系统,由北京康盛新创科技有限责任公司推出,目前最新版本是Discu...

    用户5920923
  • 可用于企业的三个非主流 Web 服务器

    自从 Tim Berners-Lee 在 1990 年开发 CERN httpd 以来,作为第一个 Web 浏览器的项目,Web 服务器已经走过了很长一段路。

    Debian社区
  • 如何快速搭建 Discuz! 论坛

    Discuz!全称:Crossday Discuz! Board,是一套免费使用的社区论坛软件系统,由北京康盛新创科技有限责任公司推出,目前最新版本是Discu...

    如花
  • 用腾讯云服务器快速搭建 Discuz! 论坛

    Discuz!全称:Crossday Discuz! Board,是一套免费使用的社区论坛软件系统,由北京康盛新创科技有限责任公司推出,目前最新版本是Discu...

    用户6511152
  • Nginx服务器的使用与反向代理负载均衡

    我们生活的世界中,有的时候需要上网。我们可以浏览很多很多的网页,这些网页都是由一系列的程序组成,但是我们是否想过,这些程序存储在什么地方呢?没错,这些程序都是存...

    代码艺术

扫码关注云+社区

领取腾讯云代金券