`
wx1569488408
  • 浏览: 79139 次
文章分类
社区版块
存档分类
最新评论

一起写一个 Web 服务器

 
阅读更多

我相信,要成为优秀的开发者,你必须对你每天都用的底层的软件系统有进一步的理解,包括编程语言、编译器和解释器、数据库和操作系统、WEB服务器和WEB框架。为了更好更深入的理解这些系统,你可以从零开始一块砖地,一面墙地,重建它们。

子曰:闻之我也野,视之我也饶,行之我也明

“我看过的,我还记得。”

“我做过的,我都理解了。”

 

(子曰:闻之我也野,视之我也饶,行之我也明)

此时我希望你能够相信,从重建不同的软件系统来开始来学习它们是如何工作的,是一个好主意。

在这个由3部分组成的系列文章中,我会向你展示怎样搭建一个基本的WEB服务器。咱们开始吧。

重中之重,什么是WEB服务器?

简而言之,它是一个位于一个物理服务器上的网络服务器(呀,服务器上的服务器),它等待客户端发送请求。当它接收到一个请求,就会生成一个响应并回发给客户端。客户端和服务器使用HTTP协议通信。客户端可以是浏览器或者别的使用HTTP协议的软件。

一个非常简单的WEB服务器实现长什么样呢?以下是我写的一个。例子是用Python语言写的,但是即使你不会Python(它是一个非常易学的语言,试试!),你仍然可以通过代码和下面的解释理解相关概念:

Python

import socket
 
HOST, PORT = '', 8888
 
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print 'Serving HTTP on port %s ...' % PORT
while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(1024)
    print request
 
    http_response = """
HTTP/1.1 200 OK
 
Hello, World!
"""
    client_connection.sendall(http_response)
    client_connection.close()


Python把上面的代码保存到webserver1.py或者直接从GitHub下载,然后像下面这样在命令行运行它

$ python webserver1.py
Serving HTTP on port 8888 …


现在在你的WEB浏览器地址栏里输入以下URL http://localhost:8888/hello,敲回车,见证奇迹的时刻。你会看到浏览器显示”Hello, World!“,像这样:

认真做一下吧,我会等你的。

做完了?很好。现在我们讨论一下它到底怎么工作的。

首先我们从你刚才键入的WEB地址开始。它叫URL,这是它的基本结构:

这个就表示怎样告诉浏览器要查找和连接的WEB服务器地址,和你要获取的服务器上的页面(路径)。但是在浏览器发送HTTP请求前,浏览器需要先和WEB服务器建立TCP连接。然后浏览器在TCP连接上发送HTTP请求,然后等待服务器回发HTTP响应。当浏览器接收到响应后,显示响应,在本次例子中,浏览器显示“Hello, World!”。

我们再详细探索一下客户端和服务器在发送HTTP请求和响应前如何建立TCP连接的。在建立连接,它们必须使用所谓的sockets。用你命令行下的telnet手动模拟浏览器吧,而不是直接使用浏览器。

在运行WEB服务器的同一台电脑上,在命令行启动一个telnet会话,指定连接到localhost主机,连接端口为8888,然后按回车:

Python


$ telnet localhost 8888
Trying 127.0.0.1 …
Connected to localhost.


此时,你已经和运行在你本地主机的服务器建立了TCP连接,已经准备好发送并接收HTTP消息了。下图中你可以看到一个服务器要经过的标准步骤,然后才能接受新的TCP连接。

在同一个telnet会话中,输入 GET /hello HTTP/1.1然后敲回车:

Python


$ telnet localhost 8888
Trying 127.0.0.1 …
Connected to localhost.
GET /hello HTTP/1.1
 
HTTP/1.1 200 OK
Hello, World!


你完成了手动模拟浏览器!你发送了一个HTTP请求并得到了一个HTTP响应。这是HTTP请求的基本结构:

HTTP请求由行组成。行指示了HTTP方法(GET,因为我们请求我们的服务器返回给我们一些东西)、代表我们想要的服务器上的“页面”的路径 /hello和协议版本。

为了简单起见,此时我们的WEB服务器完全忽略了上面的请求行。你也可以输入任何垃圾字符取代“GET /hello HTTP/1.1”,你仍然会得到“Hello, World!”响应。

一旦你输入了请求行,敲了回车,客户端就发送请求给服务器,服务器读取请求行,打印出来然后返回相应的HTTP响应。

以下是服务器回发给客户端(这个例子中是telnet)的HTTP响应:

咱们分析一下它,响应包含了状态行HTTP/1.1 200 OK,随后一个必须的空行,和HTTP响应body。

响应状态行TTP/1.1 200 OK包含了HTTP版本,HTTP状态码和HTTP状态码理由短语OK。浏览器得到响应时,它就显示响应的body,所以你就看到了“Hello, World!”

这就是WEB浏览器怎么工作的基本模型。总结来说:WEB服务器创建一个监听socket然后开始循环接受新连接。客户端初始化一个TCP连接,在连接成功后,客户端发送HTTP请求到服务器,服务器响应一个显示给用户的HTTP响应。客户端和服务器都使用socket建立TCP连接。

你现在你拥有了一个非常基础的WEB服务器,你可以用浏览器或其他的HTTP客户端测试它。正如你看到的,使用telnet手动输入HTTP请求,你也就成了一个人肉 HTTP 客户端。

对你来说有一个问题:“怎样在你的刚完成的WEB服务器下运行 Django 应用、Flask 应用和 Pyramid  应用?在不单独修改服务器来适应这些不同的 WEB 框架的情况下。”

我会在本系列的第 2 部分秀给你看的。请保持关注哦。

顺便说下,我在写一本书《一起构建WEB服务器:第一步》,它解释了从零开始写一个基本的WEB服务器,还更详细地讲解了我上面提到的话题。订阅邮件组来获取关于书籍和发布时间和最近更新。

灵感来自于 Lead with a Story: A Guide to Crafting Business Narratives That Captivate, Convince, and Inspire

转载于:https://my.oschina.net/u/2902719/blog/895273

分享到:
评论

相关推荐

    Linux服务器安全策略全接触之二——Web服务器安全策略.pdf

    "Linux服务器安全策略全接触之二——Web服务器安全策略" 本文将详细介绍 Linux 服务器安全策略中的 Web 服务器安全策略,涵盖 Web 服务器安全隐患、Apache 服务器安全配置技巧和 Linux 中的安全策略。 Web 服务器...

    用Java实现Web服务器

    ### 使用Java实现Web服务器的关键知识点 #### HTTP协议详解 HTTP(HyperText Transfer Protocol)协议是互联网上应用最为广泛的一种网络协议,它定义了客户端(通常是Web浏览器)与服务器端(Web服务器)之间的...

    C#编写的简单web服务器(含源代码)

    本程序是一个C#编写的简单的web服务器,在 .NET 环境下运行。实现了 HTTP/1.1 的部分内容,目前它支持GET和HEAD命令,支持断点续传和多线程下载。在命令行下面运行,命令格式:([路径]httpsrv [[绑定的IP] (端口号)...

    Asp.Net服务器端控件

    Asp.Net服务器端控件遵循一个详细的生命周期,包括初始化、加载、验证、呈现和卸载等阶段。开发者可以在这些阶段中插入代码,以在适当的时间执行操作。 7. **控件集成功能** Asp.Net服务器端控件可以与其他控件...

    手写服务器源代码.rar

    这个名为"手写服务器源代码.rar"的压缩包,显然包含了一个简易的登录服务器的源代码,提供了一个实践和学习的机会。 首先,我们要了解的是服务器的基本工作原理。服务器是接收并处理客户端请求的计算机程序,它们...

    java实现web server功能

    本资源以"java实现web server功能"为主题,旨在教你如何使用Java编写一个简单的Web服务器,让我们一起深入探讨这个主题。 首先,理解Web服务器的基本工作原理至关重要。Web服务器接收客户端(通常是Web浏览器)发送...

    基于Web的人工智能专家系统简易动物识别系统

    【标题解析】 "基于Web的人工智能专家系统简易动物识别系统"是一个利用Web技术构建的人工智能应用,它的核心功能是实现对动物的...通过这个系统,我们可以学习到如何将这些技术融合在一起,构建一个实际的应用程序。

    tornado python web开发

    Tornado全称Tornado Web Server,是一个用Python语 言写成的Web服 务器兼Web应用框架,由FriendFeed公 司 在自己的网站FriendFeed中使用,被Facebook收购 以后框架在2009年9月以开源软件形式开放给大众。 特点: 作为...

    一个完全免费的WEB打印插件控件,支持:C#/vb.net/asp/PHP/JSP,也有实例

    在IT行业中,Web打印是一个重要的需求,特别是在企业环境中,用户可能需要从网页上直接打印文档或报告。"一个完全免费的WEB打印插件控件,支持:C#/vb.net/asp/PHP/JSP,也有实例" 提供了一个解决方案,允许开发者在...

    webservice 实现 两个数相加

    8. **部署和测试**:开发完成后,Web服务通常会部署到Web服务器,如Tomcat或Jetty。Eclipse提供了内置的Web服务测试工具,如WSDL向导,可以方便地测试服务是否正常工作。 在"webServiceTest"这个项目中,开发者可能...

    Django是一个开放源代码的Web应用框架

    总的来说,Django是一个功能全面、易学易用的Web开发框架,适用于快速开发高质量的Web应用。通过学习和实践Django,开发者可以提升工作效率,同时享受到Python语言的优雅和强大。在实际项目中,Django提供的“开箱即...

    jsp 写的 一个小例子

    【标题】"jsp 写的 一个小例子"揭示了这个压缩包内容是关于使用Java Server Pages(JSP)技术开发的一个Web应用程序实例。JSP是一种动态网页开发技术,它允许开发者在HTML或XML文档中嵌入Java代码,从而实现服务器端...

    php开发的一个3d的web

    综上所述,这个项目是一个基于PHP的3D Web应用,目前处于早期开发阶段,使用Apache作为Web服务器,MySQL作为数据存储,开发者邀请社区成员一同参与开发和优化。项目文件包括网页界面、注册流程、数据库结构、说明...

    AspWebServer10.rar

    IIS是微软提供的一个功能强大的Web服务器,通常与Windows Server操作系统一起使用,但它同样可以安装在Windows XP上。然而,对于个人开发者或者小型项目,IIS可能显得过于复杂或资源占用过高。 **ASPWebServer10的...

    搭建OTA下载服务器.doc

    要搭建OTA环境,我们仍然使用TOMCAT作为web服务器。首先,你要确保你的IP地址能被外界访问到,编辑TOMCAT_HOME/conf/web.xml看他是否支持下面两种MIME类型: * JAD:text/vnd.sun.j2me.app-descriptor * JAR:...

    都说Djnago框架重,那就让哥用15行代码写个django web程序.pdf

    【描述】:本文将展示如何用简洁的代码快速搭建一个基于Django的Web应用,挑战通常认为Django框架复杂的观念。我们将通过15行Python代码实现一个简单的Django网站,提供一种轻量级的Django体验。 【标签】:Django...

    一个利用 IE 内核自己写的 Web 浏览器的例子

    标题中的“一个利用 IE 内核自己写的 Web 浏览器的例子”指的是开发人员使用 Internet Explorer(IE)的浏览技术,即 Trident 渲染引擎,创建了一个自定义的 Web 浏览器。这个项目展示了如何在非标准浏览器环境中...

    跟我一起写大虾网(第3天)

    【标题】"跟我一起写大虾网(第3天)" 暗示了这是一个关于编程教程的系列,可能是一个在线课程或博客文章的第三部分,专注于构建一个名为“大虾网”的项目。在这个阶段,作者可能讲解了项目的进一步开发、功能实现或者...

    学习SSH写的一个类似当当网系统

    标题中的“学习SSH写的一个类似当当网系统”指的是基于SSH(Struts、Hibernate、Spring)框架开发的一个模仿当当网功能的项目。这个系统旨在为开发者提供一个学习和实践的平台,帮助他们理解如何在实际开发中运用...

    web.xml配置

    Web.xml 是一个部署描述符文件,用于控制 Web 应用的行为。它是所有基于 Java 的 Web 应用程序中的一个关键文件。本文将详细讲解 web.xml 的配置信息。 头和根元素 在 web.xml 文件中,必须以一个 XML 头开始。这...

Global site tag (gtag.js) - Google Analytics