码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2015-07-06 23:29:54      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:web服务   http服务器   python   

使用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界面进行管理,例如路由器的管理界面等等。
这里只是为大家提供了一个思路。技术的东西,就看你是怎么个用法了。

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

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

标签:web服务   http服务器   python   

原文地址:http://blog.csdn.net/yagas/article/details/46668627

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!