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

来源:互联网 发布:美女喜欢男生 知乎 编辑:程序博客网 时间:2024/05/22 14:24

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

# coding=utf-8import socketclass 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.1Host: localhostConnection: keep-aliveCache-Control: max-age=0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: zh-CN,zh;q=0.8GET /favicon.ico HTTP/1.1Host: localhostConnection: keep-alivePragma: no-cacheCache-Control: no-cacheUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36Accept: */*Referer: http://localhost/Accept-Encoding: gzip, deflate, sdchAccept-Language: zh-CN,zh;q=0.8

主要信息是头一行:

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

请求的方式,请求地址,请求的协议。还有一些浏览器发送的来源主机,浏览器信息,语言信息,缓存信息等等。
服务器在接收到请并进行处理,之后同样以报头的形式返回数据,完成一次数据请求与响应。

HTTP/1.1 200 OKContent-Type:text/html;Charset=utf-8数据主体信息

响应信息的报送结构是:响应协议 状态 OK,空一行,然后是输出html内容
当我们了解了这一些信息之后,只要针对请求的地址,返回相应的数据,无论是使用什么编程语言,ruby, perl, C, go我们都可以实现一个简易的WEB服务器。
可以把这个简易的web服务器嵌入到某个系统服务中,为用户提供WEB界面进行管理,例如路由器的管理界面等等。
这里只是为大家提供了一个思路。技术的东西,就看你是怎么个用法了。

0 0
原创粉丝点击