开发Web服务器的提示

时间:2009-05-16 18:29:17

标签: webserver projects

在这里做了一些搜索后,我发现没有关于开发Web服务器的问题。

我主要是因为两个原因而这样做。作为一个侧面项目,并了解有关开发服务器程序的更多信息。这不会变成一个可用的应用程序,更像是一个学习工具

所以问题很简单。

  • 你开发了一个网络服务器吗? (无论用哪种语言)
  • 您可以提供什么问题和其他好的提示

欢迎链接到有用的网站,但不要链接到开源的工作项目,因为这是关于学习的过程。

8 个答案:

答案 0 :(得分:17)

Web服务器最初只是一段非常简单的代码:

  • 在端口80上打开TCP / IP套接字
  • 虽然没有终止
    • 等待该套接字上的连接
    • 当有人向您发送HTTP标头时
      • 找到文件的路径
      • 将文件复制到套接字

所以代码的大纲很简单。

现在,您需要处理一些复杂问题:

  • 在最简单的代码版本中,当您与一个浏览器通话时,其他所有浏览器都无法连接。您需要提出一些处理多个连接的方法。
  • 除了静态文件之外,能够发送更多内容通常很方便(尽管第一个HTTP服务器确实如此),因此您需要能够运行其他程序。

通过多种可能的选择,处理多个连接的可能性也相对容易。

  • 最简单的版本(再次,这是它最初的方式)是让侦听端口80的代码为该连接设置一个特定的套接字,然后分叉自己的副本来处理那个连接。该进程一直运行直到套接字关闭,然后终止。然而,这是相对昂贵的:一般来说,fork需要几十毫秒,因此限制了你运行的速度。
  • 第二个选择是创建一个轻量级进程 - 一个/ k /一个线程 - 来处理请求。

运行程序实际上也相当容易。通常,您定义CGI目录的特殊路径;具有通过该目录的路径的URL然后将路径名称解释为程序的路径。然后,服务器将使用fork / exec创建子进程,并将STDOUT连接到套接字。然后程序运行,将输出发送到STDOUT,然后将其发送到客户端浏览器。

这是基本模式; Web服务器所做的一切只是为这个基本模式添加了多余的功能和附加功能。

以下是代码示例的其他一些来源:


它几乎不会影响你真正想要的东西,但是对于简单,它很难从this one中击败http://www.commandlinefu.com

  

$ python -m SimpleHTTPServer

答案 1 :(得分:9)

首先,请不要让它成为一个可用的项目 - 获得Web服务器的安全性非常困难。

好的,请注意以下事项:

  1. 接受的主题 连接需要交给 背景线程尽快 可能。
  2. 你不能拥有一个主题 对于每一个连接 - 与 大量的你将耗尽你的 线程限制。
  3. 使用某种方式 工作线程池来处理你的 要求。
  4. 确保您擦洗     获得HTTP GET时的URL     请求。所以我做不了什么     喜欢     http://localhost/../../Users/blah/     获得更高级别的访问权。
  5. 确保始终设置相关内容 内容和哑剧类型。
  6. 祝你好运 - 这是一份很糟糕的工作。

答案 2 :(得分:1)

网络等非常标准,所以不要太担心。 (在大多数语言中有几个“即时”的示例网络服务器。)

相反,专注于实际实现HTTP规范。你会惊讶于a)你不知道的东西和b)多少应该符合HTTP标准的东西,实际上并非如此,但是假它很好。

然后你会惊讶于网络的运作。

完成HTTP后,尽量尝试实施IMAP。

答案 3 :(得分:1)

几年前我在Python中编写了一个轻量级的网络服务器,也作为一个学习项目。

我能给出的最简单的建议,特别是作为一个学习项目,是构建一个有效的核心,然后是迭代设计。不要瞄准跳跃的月亮,开始非常小,然后添加特色,精炼和继续。我建议使用一个鼓励实验的工具,比如Python,你可以在这里同时输入和测试代码。

答案 4 :(得分:1)

我TAed的课程有代理任务,所以我可以在这里阐明一些,我想。

所以,你最终会做很多标题更改只是为了让你的生活更轻松。也就是说,HTTP / 1.0比HTTP / 1.1更容易处理。你不想处理管理超时和保持活动等事情。每个事务一个连接最简单。

你将要进行大量的解析。在C中解析是很难的。我建议你写一个像

这样的函数
int readline(char *buff, int maxLen) {
    while((c = readNextCharFromSocket(&s)) && c != '\n' && i < maxLen)
      buff[i++] = c;
    return i;
}

并且一次处理一行,这完全是因为最简单的方法是一次在一行上使用现有的C字符串函数。另外,记住行是\ r \ n分开的,标题以\ r \ n \ r \ n。

终止

主要的难点是解析,只要你能读取文件,其他一切都会按预期工作。

对于调试,您可能希望打印出在传输中断时传递给标准的标题。

答案 5 :(得分:1)

local-web-server是用node.js编写的简单开发Web服务器的一个例子..它比python -m SimpleHTTPServer更可靠,功能更多

答案 6 :(得分:0)

我正在考虑启动同一个项目,以便更好地学习Python。有BaseHTTPServer class这是一个非常好的起点。

以下是一些教程式文章:1&amp; 2

答案 7 :(得分:0)

我已经开发了一个使用C语言运行(Html和PHP)的Web服务器 它不是那么复杂你应该知道如何使用TCP / IP套接字,Thread以处理多个请求,进程fork(你需要为php命令行执行创建一个子进程(我使用了execvp))

我认为最令人讨厌的部分是处理c语言中的字符串并在命令行中发送POST / GET请求。

祝你好运