您的位置:首页 > 理论基础 > 计算机网络

python案例学习——http服务器

2015-09-25 14:12 405 查看
没分析完呢

,没搞定呢,回头把代码的分析都写上来。

这是一个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编辑太难用了,尤其插代码,动不动就全乱了,还得找好位置)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: