自己动手开发简易的Web服务器

使用python实现一个简易版的web服务器,旨在了解web服务器的工作原理,及了解HTTP协议。没有涉及多线程处理,并发之类的内容,以后再专门另外研究。首先上代码,稍后再作讲解。

# coding=utf-8
import socket

class httpd(object):

        def __init__(self,host,port):
                self.host = host
                self.port = port

        def parse_info(self,data):
                global _ENV
                _ENV = {}
                lines = data.splitlines()
                if len(lines)>0:
                        info = lines[0].split()
                        _ENV["method"] = info[0]
                        _ENV["uri"] = info[1]
                        del lines[0]
                        for i in lines:
                                offset = i.index(":")
                                _ENV[ i[0:offset] ] = i[offset+1::] 

        def log( self,data ):
                f = open("access.log","a")
                f.write( data )
                f.close()

        def start(self):
                print "python web server starring...\nlisten at %s" % self.port
                httpd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                httpd.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
                httpd.bind((self.host,self.port))
                httpd.listen(5)

                while True:
                        conn,addr = httpd.accept()
                        request_data = conn.recv(1024)
                        self.log( request_data )
                        self.parse_info( request_data.strip() )
                        body = "HTTP/1.1 200 OK\nContent-Type: text/html;charset=utf-8\nPower: Python web\nAuther: yagas\n\n"
                        body += "<h1>简易的WEB SERVER实例</h1>"
                        conn.sendall(body)
                        conn.close()

if __name__ == "__main__":
        server = httpd("0.0.0.0",80)
        server.start()

我们通过浏览器进行访问的时候,可以看到”简易的WEB SERVER实例”的页面,并记录下了访问的时候接收到的报头数据,如下:

GET / HTTP/1.1
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

GET /favicon.ico HTTP/1.1
Host: localhost
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36
Accept: */*
Referer: http://localhost/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

主要信息是头一行:

GET / HTML1.1
GET /favicon.ico HTTP/1.1

请求的方式,请求地址,请求的协议。还有一些浏览器发送的来源主机,浏览器信息,语言信息,缓存信息等等。

服务器在接收到请并进行处理,之后同样以报头的形式返回数据,完成一次数据请求与响应。

HTTP/1.1 200 OK
Content-Type:text/html;Charset=utf-8

数据主体信息

响应信息的报送结构是:响应协议 状态 OK,空一行,然后是输出html内容

当我们了解了这一些信息之后,只要针对请求的地址,返回相应的数据,无论是使用什么编程语言,ruby, perl, C, go我们都可以实现一个简易的WEB服务器。

可以把这个简易的web服务器嵌入到某个系统服务中,为用户提供WEB界面进行管理,例如路由器的管理界面等等。

这里只是为大家提供了一个思路。技术的东西,就看你是怎么个用法了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 01:05:20

自己动手开发简易的Web服务器的相关文章

Tinywebserver:一个简易的web服务器

这是学习网络编程后写的一个练手的小程序,可以帮助复习I/O模型,epoll使用,线程池,HTTP协议等内容. 程序代码是基于<Linux高性能服务器编程>一书编写的. 首先回顾程序中的核心内容和主要问题,最后给出相关代码. 0. 功能和I/O模型 实现简易的HTTP服务端,现仅支持GET方法,通过浏览器访问可以返回相应内容. I/O模型采用Reactor(I/O复用 + 非阻塞I/O) + 线程池. 使用epoll事件循环用作事件通知,如果listenfd上可读,则调用accept,把新建的f

asp.net 开发问题:Web 服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值。

"Web 服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值." 这个问题在开发需要上传文件的时候可能会遇到,今天遇到这个问题,百度过也有挺多的修改方法. 方法1: 修改IIS的applicationhost.config文件位置: %windir%/system32/inetsrv/config/applicationhost.config                    或                   %windir%\system32\inetsrv\c

一个简易的web服务器:Tinywebserver

这是学习网络编程后写的一个练手的小程序,可以帮助复习I/O模型,epoll使用,线程池,HTTP协议等内容. 程序代码是基于<Linux高性能服务器编程>一书编写的. 首先回顾程序中的核心内容和主要问题,最后给出相关代码. 0. 功能和I/O模型 实现简易的HTTP服务端,现仅支持GET方法,通过浏览器访问可以返回相应内容. I/O模型采用Reactor(I/O复用 + 非阻塞I/O) + 线程池. 使用epoll事件循环用作事件通知,如果listenfd上可读,则调用accept,把新建的f

【安富莱专题教程第3期】开发板搭建Web服务器,利用花生壳让电脑和手机可以外网远程监控

说明:1.  开发板Web服务器的设计可以看我们之前发布的史诗级网络教程:链接.2.  需要复杂些的Web设计模板,可以使用我们V6开发板发布的综合Demo:链接.3.  教程中使用的是花生壳免费版,免费版仅支持电信用户,每个月1GB的流量,实际测试几天,稳定性还行.收费版没有这些限制.4.  现在已经用了快两年的花生壳收费版,比较稳定,基本没有死机现象.5.  不管是免费版本的花生壳还是收费版的,有时候会提示需要实名认证,可以不用管.现在还没有强制必须执行.如果长期使用的话,建议做一下认证,认

[原创]颠覆传统网站开发模式的web服务器

Jerry Server - 正式版1.0.0 文档 之前发过一篇文章,当时的想法现在看来真的不是很明确,得到了很多批评.不过,批评有利有弊,由此我又仔细思考了很多,最终明确了自己究竟要做什么.特厚着脸皮发出正式版文档! 1.缘由 以Java web举例,现在的网站系统开发模式,对于web端和服务端的数据交互以及页面渲染,无外乎两种: 第一种是交给后端处理,Jsp,Freemark模板引擎之流,这种开发模式需要前端人员做好静态页面交给后端去处理一些其它工作.这种开发模式到如今也依旧流行,这也是招

简易Web服务器实现

手痒就自己实现了一下简易的web服务器,由于只是简易的web服务器,所以并没有什么特别高深的技术含量. 1.      TCP通信(socket) 2.      IO流 3.      线程池技术 服务器架构也简单: Request类主要是实现解析URL的功能,以获取html文件的路径. Response类实现读取html文件并且向浏览器输出html文件内容. Server类整合Request类和Response类,实现线程的run方法. Test类实现线程池,同时也是服务启动类. 下图是浏览

Java网络编程 - 浅析web服务器与浏览器的实现原理

我们基本每天都在通过WEB浏览器,去浏览一些新闻,看看视频之类的. 众所周知,这就是所谓的B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件. 那顺道就来简单的看一下,所谓的Web服务器(例如知名的Tomcat)与浏览器,基本的实现原理是什么样的呢? 首先可以明确的就是,例如我们所做的通过浏览器输入一个地址,访问一个网页的操作. 实际对应的底层操作简单来说就是:客户端(浏览器)面向于WEB服务器的网络通信. 那么

巨杉Tech | 使用 SequoiaDB + Docker + Nodejs 搭建 Web 服务器

容器化技术的出现大大简化了应用开发人员在构建底层基础设施的工作.SequoiaDB 巨杉数据库于3.2.1版本正式推出了 Docker 容器化部署方案,本文将会基于 SequoiaDB 巨杉数据库与Nodejs的 Docker 镜像搭建一个简易的 Web 服务器. 1.规划部署我们将会搭建一个三分区三副本的高可用 SequoiaDB 巨杉数据库.同时,我们将会创建一个 SequoiaDB 巨杉数据库的 MySQL 实例,用以提供 Nodejs 作为数据源. 容器角色 容器名/IP:端口 分区组

Visual Studio中用于ASP.NET Web项目的Web服务器

当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Express.Internet Information Services (IIS).外部主机或自定义 Web 服务器. 您可以将其中任何一种 Web 服务器用于基于文件的 Web 应用程序项目. 对于基于文件的网站项目,您可以使用 IIS Express. 本主题介绍每种 Web 服务器以及如何选择要用