首页 > 解决方案 > 搭建一个http服务器

问题描述

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

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

谁能向我解释如何使用此协议?HTTP数据包的形式是什么?

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

非常非常感谢你!

标签: pythonhttpserverclientpacket

解决方案


谁能向我解释如何使用此协议?HTTP数据包的形式是什么?

该规范可能会有所帮助。

关于 webz,您可以在 RFC 上找到很多规范。更多关于 HTTP 的内容如下。


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

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

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

此处列出了更多框架。

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

您只需导入框架并编写很棒的东西!:)


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

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

最小的请求如下所示:

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

第一行以动词(也称为请求方法)开头,在我们的示例中动词是GET/表示路径。想想硬盘上的文件路径。第一行的最后一部分,即HTTP/1.0告诉接收者我们正在使用哪个版本的 HTTP 进行操作。目前有 HTTP 1.0 和 HTTP 1.1;但是,如果您自己实现请求,我不会打扰 HTTP 1.1 并坚持使用 HTTP 1.0。

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

如果您将此请求发送到 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”代表一个状态码,告诉我们一切都很好。有许多状态码有自己的含义和用法。

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

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

再一次,这些标题中有许多。


如您所见,在使用 HTTP 时需要考虑很多事情,这表明如果没有很好的理由,从头开始实现 HTTP 客户端/服务器是不可行的。

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


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


推荐阅读