使用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界面进行管理,例如路由器的管理界面等等。
这里只是为大家提供了一个思路。技术的东西,就看你是怎么个用法了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/yagas/article/details/46668627