如何编写HTTP服务器?


17

如标题所示,我想编写一个HTTP服务器。我的问题是,我该怎么做?我知道这听起来很笼统,而且太“高级”,但是有一种疯狂的方法。我认为,这个问题的答案应该与语言无关。含义,无论我使用哪种语言(例如C,C ++,Java等),答案都应该相同。我对这应该如何工作有一个大致的了解:

  1. 打开端口80上的套接字。
  2. 等待客户提出请求。
  3. 阅读请求(即此人想要页面“ contact-us.html”)。
  4. 查找并阅读“ contact-us.html”。
  5. 发送html标头,然后发送“ contact-us.html”的内容
  6. 完成

就像我说的那样,我相信这是过程,但是我不确定100%。这使我想到了问题的核心。一个人如何或在哪里找到此信息?

如果我不想只写HTTP服务器怎么办,如果我不想写FTP服务器,聊天服务器,图像查看器等怎么办?一个人如何找到创建可用的HTTP服务器所需的确切步骤/过程?

一位同事告诉我有关html标头的信息,所以没有他我再也不会知道这一点。他还说了一些有关将每个请求移交给新线程的内容。是否有一些有关工作原理的大书?是否有使用HTTP服务器所需的一些手册?

我尝试谷歌搜索“ HTTP服务器如何工作”,但我只能找到针对普通百姓的答案,而不是针对希望对HTTP服务器进行编程的人。


12
RFC2616应该为您提供HTTP协议的所有细节。RFC959与FTP相同。
2013年

3
替代地(或附加地),看看如何实现现有的简单HTTP服务器。不止一个,这应该使您知道什么结构有意义。
Michael Borgwardt 2013年

Michael Borgwardt-我会这样做,但是我倾向于复制当我查看其他代码时所看到的内容。我希望能变得整洁,看看我是否可以自己做而不“作弊”。
布赖恩

您的网络搜索短语是错误的,它针对的是用户,这就是为什么您得到普通Joe的原因。使用:“如何开发HTTP服务器”,它可以更好地反映您的需求。我刚刚在Google上进行了尝试,并获得了一整页的参考资料来解释这些内容
gnat 2013年

考虑审查其他实现,例如apache tomcat。它可能做的比您想做的要多,但是它将展示一种解决问题的技术。
DwB

Answers:


19

使用RFC2616,卢克!

您阅读了HTTP / 1.1上的RFC 2616并开始尝试

那实际上是我在工学院三年级的一个项目,几乎就是项目的描述。

工具类

您的工具是:

  • 基本的网络连接(套接字管理,绑定,了解地址),
  • 对I / O流有很好的了解,
  • 非常有耐心地获取RFC的某些幕后部分(MIME类型很有趣)。

有趣的考虑

需要考虑的额外乐趣的事情:

  • 插件架构,以添加CGI / mod支持,
  • 许多事情的配置文件,
  • 关于如何优化转移的大量实验,
  • 进行了大量实验,以了解如何管理CPU和内存方面的负载,并选择调度模型(大胖均匀循环,单接受调度,多线程,多进程等)。

玩得开心。这是一件很酷的事情。

其他(简单)建议

  • FTP客户端/服务器(主要是RFC959,但有较旧的版本和某些扩展名)
  • IRC客户端/服务器(主要是RFC1459,但有扩展名)

首先可以更轻松地解决它们,而RFC则更容易理解(嗯,IRC包含一些奇怪的部分,而FTP包含的部分很清楚)。

语言选择

当然,一些实现细节将高度依赖于您用于实现它的语言和堆栈。我在C语言中使用了所有方法,但是我确信它在其他语言中同样会很有趣(好吧,也许没那么有趣,但仍然很有趣)。


是的,我也必须在学校做这个项目。它出奇的有趣,使您对“工业实力” Web服务器更加赞赏。
Evicatos

正确执行协议的实现是其中一部分。设计服务器是另一种...
tdammers

@tdammers:RFC非常好,如果您遵循它们,那么您已经可以遵循不错的准系统蓝图。您的架构设计仍有很多空间,但这是一个很好的指导性规范。
haylem 2013年

@haylem:是和否。实施该规范可以为您提供一个单独的工作人员,但是您仍然需要将此工作人员放在更大的视野中-您将如何处理并发请求?您如何提供有用的内容?您在哪里保持状态?
tdammers 2013年

@tdammers:我:You still have lots of room for your architecture design, but it's a pretty good and directive spec.您:yes and no。我认为我们已经缩小了范围,而不是RFC并不是全部。而且我认为应该由OP来发现这些事情,而不是直接将它们指出来,而不是我在“其他注意事项”部分和其他事情中已经做过的事情。这是乐趣的一部分。
haylem 2013年

2

互联网上使用的每种协议都在一个或多个称为RFC的公共文档中指定。可以在http://www.rfc-editor.org/上找到所有当前的RFC ,该文件也具有不错的搜索功能。

例如,HTTP协议(版本1.1)在RFC2616中指定,而FTP协议在RFC959中指定。

按照规范,我认为RFC具有很好的可读性。


我真的对这个RFC感到困惑。他们会更新HTTP RFC吗?在以上答案中,有一条注释指出In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).。那么,如何找到更新的RFC(如果存在)?我应该检查Obsoleted by清单吗?
SkrewEverything

@SkrewEverything:RFC不会更新,但是会被更新的RFC取代。通过单击“已过时”链接,您确实可以找到较新的版本。
Bart van Ingen Schenau
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.