twisted xmlrpc

rpc:远程过程调用

xmlrpc:以http为传输协议,通过xml文本传输数据和命令的远程过程调用.远程函数必须有返回值.

下面代码是用twisted的xmlrpc实现的,支持断点续传的支持二进制大文件的支持多客户端同时下载的下载器.

rpc server端:

from twisted.web import xmlrpc, server
from twisted.internet import reactor

import cPickle as pickle

class FileShare(xmlrpc.XMLRPC):
    def xmlrpc_echo(self, x):
        return x
    
    def xmlrpc_download(self, filename, pos, block=1024*1024*1):
        f = open(filename, "rb")
        f.seek(pos)
        data = f.read(block)
        data = data or ""
        return pickle.dumps(data) # 为了支持二进制文件而采用了pickle序列化

if __name__ == "__main__":
    reactor.listenTCP(8080, server.Site(FileShare()))
    reactor.run()

rcp client端:

# -*- coding: utf-8 -*-

import xmlrpclib
import cPickle as pickle
import time
import os
import sys

def download(rpc, filename, block=1024*1024*1):
    """默认一次传输块大小为1M,支持断点续传"""
    if os.path.exists(filename):
        complete_size = os.path.getsize(filename)
    else:
        complete_size = 0
    pos = complete_size
    data = None
    f = open(filename, "ab")
    while True:
        try:
            f.seek(pos)
            _data = pickle.loads(rpc.download(filename, pos, block))
            if _data:
                f.write(_data)
                pos += len(_data)
            else:
                f.close()
                break
        except KeyboardInterrupt:
            f.close()
            sys.exit("KeyboardInterrupt")
    

if __name__ == "__main__":
    rpc = xmlrpclib.Server("http://192.168.6.234:8080/")
    t1 = time.time()
    download(rpc, "vss2005.zip")
    print "delta t:%s" % (time.time() - t1)

# 测试数据96.7M, block大小对速度影响:
# 0.5M -> 56.2
# 1M -> 55.5
# 5M -> 63.8
# 10M -> 59.9


你可能感兴趣的:(xmlrpc)