首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >开发web服务器的技巧

开发web服务器的技巧
EN

Stack Overflow用户
提问于 2009-05-16 18:29:16
回答 8查看 7.5K关注 0票数 11

在这里做了一些搜索之后,我发现几乎没有关于开发web服务器的任何问题。

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

所以问题很简单。

  • 你开发了网络服务器吗?(不论使用何种语言)
  • 你能提供些什么好的建议吗?

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-05-16 18:36:00

web服务器一开始是一段非常简单的代码:

  • 在端口80上打开TCP/IP套接字
  • 虽然没有终止
    • 等待那个插座上的连接
    • 当有人向您发送headers时,
      • 查找文件的路径
      • 将文件复制到套接字

因此,代码的大纲很简单。

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

  • 在最简单的代码版本中,当您与一个浏览器交谈时,所有其他浏览器都无法连接。您需要想出某种方法来处理多个连接。
  • 能够发送不仅仅是一个静态文件(尽管第一个HTTP服务器正是这样做),所以您需要能够运行其他程序,这通常很方便。

处理多个连接的可能性也相对容易,有许多可能的选择。

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

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

这是基本模式;web服务器所做的其他一切只是在这个基本模式中添加额外的功能。

下面是其他一些源代码,例如代码:

  • server.aspx
  • http://cs.baylor.edu/~donahoo/practical/CSockets/textcode.html
  • http://www.paulgriffiths.net/program/c/echoserv.php
  • C++/socket.htm

它几乎没有做你真正想要的事情,但是简单地说,很难打败来自http://www.commandlinefu.comhttp://www.commandlinefu.com

$ python -m SimpleHTTPServer

票数 20
EN

Stack Overflow用户

发布于 2009-05-16 18:34:23

首先,请不要让这成为一个有用的项目-获得安全的web服务器是非常困难的。

好的,下面是一些需要记住的事情:

  1. 接受连接的线程需要尽快提交给后台线程。
  2. 您不可能为每个连接都有一个线程--如果有大量的线程,就会超出线程限制。
  3. 使用某种工作线程池来处理请求。
  4. 确保在收到HTTP请求时删除URL。所以我不能做一些像http://localhost/../../Users/blah/这样的事情来获得更高级别的访问。
  5. 确保始终设置相关内容和mime类型。

祝你好运--这是一份很棒的工作。

票数 10
EN

Stack Overflow用户

发布于 2009-05-16 18:33:54

网络等是相当标准的公平,所以不要太担心这一点。(在大多数语言中都有几个“即时”的示例网络服务器。)

相反,专注于实际实现HTTP规范。你会惊讶于( a)你不知道的东西,和( b)有多少东西应该是符合HTTP的,实际上不是,但是伪装得很好。

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

当您完成HTTP时,请尝试实现IMAP。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/872993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档