没分析完呢,没搞定呢,回头把代码的分析都写上来。
这是一个http服务器的代码,直接运行能实现http访问,但是访问没内容,也就是没有任何的处理逻辑,只有一个打印显示,也只是服务端。
最终目标是要实现一个http文件服务器,可以直接下载文件的,配合我的工程使用,服务端只推送更新通知,终端要去指定的http服务器下载文件,就这么简单一个(子)需求。
感觉代码并不那么完全,那是因为用了基类,都是固定的套路了,就自己派生,改一下处理逻辑,不过具体都能怎么改呢,怎么实现文件读取/发送呢,因为不熟悉python,所以得研究一下。
代码如下:
#encoding=utf-8
'''
Created on 2012-11-7
@author: Steven
http://www.lifeba.org
基于BaseHTTPServer的http server实现,包括get,post方法,get参数接收,post参数接收。
'''
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import io,shutil
import urllib,time
import getopt,string
class MyRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.process(2)
def do_POST(self):
self.process(1)
def process(self,type):
print self.command
print "hahaha--------------"
print self.path
print "------------------end"
content =""
if type==1:#post方法,接收post参数
datas = self.rfile.read(int(self.headers['content-length']))
datas = urllib.unquote(datas).decode("utf-8", 'ignore')#指定编码方式
datas = transDicts(datas)#将参数转换为字典
if datas.has_key('data'):
content = "data:"+datas['data']+"\r\n"
if '?' in self.path:
query = urllib.splitquery(self.path)
action = query[0]
if query[1]:#接收get参数
queryParams = {}
for qp in query[1].split('&'):
kv = qp.split('=')
queryParams[kv[0]] = urllib.unquote(kv[1]).decode("utf-8", 'ignore')
content+= kv[0]+':'+queryParams[kv[0]]+"\r\n"
#指定返回编码
enc="UTF-8"
content = content.encode(enc)
f = io.BytesIO()
f.write(content)
f.seek(0)
self.send_response(200)
self.send_header("Content-type", "text/html; charset=%s" % enc)
self.send_header("Content-Length", str(len(content)))
self.end_headers()
shutil.copyfileobj(f,self.wfile)
def transDicts(params):
dicts={}
if len(params)==0:
return
params = params.split('&')
for param in params:
dicts[param.split('=')[0]]=param.split('=')[1]
return dicts
if __name__=='__main__':
try:
# print "bases:", MyRequestHandler.__bases__
# print "doc:", MyRequestHandler.__doc__
# print "dict:", MyRequestHandler.__dict__
# print "module:", MyRequestHandler.__module__
# print "name:", MyRequestHandler.__name__
server = HTTPServer(('', 8000), MyRequestHandler)
print 'started httpserver...'
server.serve_forever()
except KeyboardInterrupt:
server.socket.close()
pass
结束标记(ps,这个csdn编辑太难用了,尤其插代码,动不动就全乱了,还得找好位置)