搭建一个http服务器

Building an http server

所以我需要构建一个 HTTP 服务器来联系客户端并向他发送图片或计算等数据,并创建包含这些内容的页面。我猜你明白我真的不知道我在做什么......:(

我知道 python 和客户端-服务器项目的基础(+),但我不了解 HTTP 协议,而且我在互联网上阅读的内容也一无所知...

任何人都可以向我解释如何使用此协议吗? HTTP数据包的格式是什么?

这是我不明白的 1 个问题的例子:我被要求获取一个数据包(我做了)并了解那里的请求是什么,然后发回客户想要的文件的名称然后是文件本身。我打印了数据包,但不明白请求在哪里或客户想要什么...

非常非常感谢!

Can anyone explain to me how to work with this protocol? What is the form of HTTP packets?

The specification might be helpful.

关于 webz,您会在 RFC 上找到很多规范。 下面是关于 HTTP 的更多内容。


(由于您似乎是编程新手,所以我想我可能想告诉您以下内容:)

通常不会直接与 HTTP(S) 数据包交互。相反,您使用一个框架,例如 flask, django, aiohttp 等等。框架的选择取决于用例。例如:

  • 您需要数据库、身份验证和任何可以想象的功能吗?使用 Django。
  • 您只想创建一个没有臃肿框架的WebApplication?使用 Flask。
  • 您需要最低限度还是想充当客户?使用 aiohttp。

列出了更多框架 here

使用此类框架的优势在于它们通常包含有用的东西,这些东西经过了实战测试(即通常没有错误),而您不必弄清楚某些协议的特性。

你直接导入框架,写的牛逼! :)


(无论如何,为了完整性,这里有一个非常简单的概述)

因此,HTTP 是基于 TCP 的文本协议,这基本上意味着您可以通过简单的 tcp socket 发送文本。当您收到请求时,您必须 "parse"(即理解其内容)。对我们来说幸运的是,请求是标准化的并遵循相同的方案。

最小的请求如下所示:

GET / HTTP/1.0
Host: www.server.com

第一行以 verb (also called request method) 开头,在我们的示例中动词是 GET/ 表示路径。想想硬盘上的文件路径。第一行的最后一部分,即 HTTP/1.0,告诉接收者我们正在使用哪个版本的 HTTP。目前有HTTP 1.0和HTTP 1.1;但是,如果您自己实现请求,我不会为 HTTP 1.1 而烦恼,而是坚持使用 HTTP 1.0。

最后,Host: www.server.com 行告诉我们要与哪个服务器通信,因为 HTTP 服务器的多个实例可以 运行 在同一个 ip 下。这用于旋转子域。

如果您将此请求发送到 HTTP 服务器,您可能会收到这样的响应:

HTTP/1.0 200 OK
Server: Apache/1.3.29 (Unix) PHP/4.3.4
Content-Length: 1337
Connection: close
Content-Type: text/html

<DATA>

此响应包含第一行中的状态 HTTP/1.0 200 OK。数字和 'OK' 代表状态代码,告诉我们一切都很好。 many status codes 有自己的含义和用法。

第一行之后的行是所谓的 Response-Headers。它们提供有关响应的其他有用信息。例如,当我们打开像 'whosebug.com' 这样的站点时,服务器会向我们传输一个 HTML 文件供浏览器解释。在此之前,我们需要知道 HTML 文件的大小。

幸运的是,服务器事先用 Content-Length: 1337 行告诉我们,该文件有 1337 字节大。文件本身将出现在 <DATA> 占位符所在的位置。

还有很多这样的 headers


如您所见,在使用 HTTP 时需要考虑很多事情,表明如果没有充分的理由,从头开始实施 HTTP client/server 是不可行的。

相反,最好使用上面列出的框架之一(对于 python)。


最后一点: 在尝试尽可能简单地解释这些概念的过程中,我可能遗漏或过度简化了一些事情。如果您发现任何错误,请告诉我。