文档章节

Python 使用XML-RPC进行文件共享

姐夫
 姐夫
发布于 2012/07/23 16:03
字数 692
阅读 432
收藏 4

1.目录结构

|__ config.ini

|__P2PClinet.py

|__P2PServer.py

|__url.txt

2.文件内容

config.ini

[SERVER_INFO]
PORT = 服务器端口号
DIRECTORY = 共享文件夹的路径
URL_FILE = url.txt

P2PClinet.py

'''
Created on 2012-7-21

author: Jeff_Yu
'''

from xmlrpclib import ServerProxy, Fault
from cmd import Cmd, PROMPT
from random import choice
from string import lower, lowercase
from P2PServer import Node, UNHANDLED
from threading import Thread
from time import sleep
import sys, ConfigParser, socket

HEAD_START = 0.1 # seconds
SECRET_LENGTH = 100


def randomString(length):
    """return the random string by given length"""
    
    chars = []
    letters = lowercase[:26]
    while length > 0:
        length -= 1
        chars.append(choice(letters))
        
    return ''.join(chars)

class Client(Cmd):
    
    prompt = '>'
    
    def __init__(self, url, dirname, urlfile):
        
        Cmd.__init__(self)
        self.secret = randomString(SECRET_LENGTH)
        n = Node(url, dirname, self.secret)
        t = Thread(target=n._start)
        t.setDaemon(1)
        t.start()
        sleep(HEAD_START)
        self.server = ServerProxy(url)
        for line in open(urlfile):
            line = line.strip()
            self.server.hello(line)
            

    def do_fetch(self, arg):
        
        try:
            self.server.fetch(arg, self.secret)
        except Fault, f:
            if f.faultCode != UNHANDLED: raise
            print "Couldn't find the file", arg
            
    def do_exit(self,arg):
        
        print
        sys.exit()
        
    do_EOF = do_exit

class MyConfigParser:
    
    def __init__(self, urlfile):
        
        self.urlfile = urlfile
        
        try: 
            f = open(self.urlfile,"r")
        except IOError: 
            meg = "file %s is not found in the path >> %s" % (self.urlfile,os.path.abspath('.'))
            return (0,meg)

        self.config = ConfigParser.ConfigParser()       
        self.config.readfp(f)
        
        f.close()


    def getValueFromcfig(self,section,filed):

        try: 
            value = self.config.get(section,filed)
        except ConfigParser.NoOptionError: 
            meg = "%s is not found in file %s, under section %." %(filed, self.urlfile, section)
            return (0,meg)
            
        return(1,value)
        
        

def main():
    
    configfile = "config.ini"
    cfig = MyConfigParser(configfile)

    #get port
    res = cfig.getValueFromcfig("SERVER_INFO", 'PORT')
    if (res[0] == 0):
        print res[1]
        raw_input()
        sys.exit()
    else:
        port = res[1]
    
    #get directory
    res = cfig.getValueFromcfig("SERVER_INFO", 'DIRECTORY')
    if (res[0] == 0):
        print res[1]
        raw_input()
        sys.exit()
    else:
        directory = res[1]
        
    #get urlfile    
    res = cfig.getValueFromcfig("SERVER_INFO", 'URL_FILE')
    if (res[0] == 0):
        print res[1]
        raw_input()
        sys.exit()
    else:
        urlfile = res[1]
    
    url = "http://%s:%s"%(socket.gethostname(),port)
    
    print "You URL is %s, you can introduce it to your friend."%url
    
    client = Client(url, directory, urlfile)
    client.cmdloop()
    
if __name__ == '__main__': main()

P2PServer.py

'''
Created on 2012-7-21

author: Jeff_Yu
'''

from xmlrpclib import ServerProxy, Fault
from os.path import join, isfile, abspath
from SimpleXMLRPCServer import SimpleXMLRPCServer
from urlparse import urlparse
import sys


SimpleXMLRPCServer.allow_reuse_address = 1

MAX_HISTORY_LENGTH = 6

UNHANDLED = 100
ACCESS_DENIED = 200

class UnhandledQuery(Fault):
    """
    unable to handle the query
    """
    
    def __init__(self, message = "Couldn't handle the query"):
        Fault.__init__(self, UNHANDLED, message)
        

class AccessDenied(Fault):
    """
    Access denied
    """
    def __init__(self, message = "Access denied"):
        Fault.__init__(self, ACCESS_DENIED, message)


def inside(dir, name):
    """
    check whether can find file in the dir
    """
    dir = abspath(dir)
    name = abspath(name)
    return name.startswith(join(dir,''))


def getPort(url):
    """get port from URL"""
    
    name = urlparse(url)[1]
    parts = name.split(':')
    return int(parts[-1])


class Node:
    """P2P network node"""
    
    def __init__(self, url, dirname, secret):
        self.url = url
        self.dirname = dirname
        self.secret = secret
        self.known = set()
        
    def query(self, query, history=[]):
        """ query the file"""
        
        try:
            return self._handle(query)
        except UnhandledQuery:
            history = history + [self.url]
            if len(history) >= MAX_HISTORY_LENGTH: raise
            return self._broadcast(query, history)
        
    def hello(self, other):
        """introduce self"""
        
        self.known.add(other)
        return 0
    
    def fetch(self, query, secret):
        """make the node find file and download"""
        
        if secret != self.secret: raise AccessDenied
        result = self.query(query)
        f = open(join(self.dirname, query),'w')
        f.write(result)
        f.close()
        return 0

        
    def _start(self):
        """start server"""
        
        s = SimpleXMLRPCServer(("", getPort(self.url)), logRequests=True, allow_none=True)
        s.register_instance(self)
        s.serve_forever()
        
    def _handle(self, query):
        
        dir = self.dirname
        name = join(dir, query)
        if not isfile(name): raise UnhandledQuery
        if not inside(dir, name): raise AccessDenied
        return open(name).read()
    
    def _broadcast(self, query, history):
        """used to query other known Node"""
        
        for other in self.known.copy():
            if other in history:continue
            
            try:
                s = ServerProxy(other)
                return s.query(query, history)
               
            except Fault, f:
                if f.faultCode == UNHANDLED: pass
                else: self.known.remove(other)
            except: 
                self.known.remove(other)
        
        raise UnhandledQuery
    
def main():
    url, directory, secret = sys.argv[1:]
    n = Node(url, directory, secret)
    n._start()
    
if __name__ == '__main__': main()

url.txt

http://机器名称1:端口1
http://机器名称2:端口2
http://机器名称3:端口3

 

 

 使用方法截图稍后发出。。。

 

© 著作权归作者所有

姐夫
粉丝 49
博文 34
码字总数 8509
作品 0
浦东
程序员
私信 提问
新课上线|Python实现图片拼接与混合、XML-RPC文件共享程序等

关注「实验楼」,每天分享一个项目教程 最近又上线了哪些新课程?快来看看吧~ 会 员 课 一、《Python3 实现图片拼接与混合》 课程来源:selfim 课程简介:本课程主要是利用 Python 的第三方...

moy37rqw1jarn33bgzk
2018/05/12
0
0
Python RPC 之 Thrift

thrift-0.12.0 python3.4.3 Thrift 简介: Thrift 是一款高性能、开源的 RPC 框架,产自 Facebook 后贡献给了 Apache,Thrift 囊括了整个 RPC 的上下游体系,自带序列化编译工具,因为 Thri...

dragon_tech
01/07
50
0
Spring Python 1.2.0.RC1 发布

Spring Python 是 Spring 开发框架在 Python 语言上的一个移植版本。 新版本将 Python 升级到 2.6 版本,不再支持 Python 2.4 和 2.5,这样就可以利用 Python 新版本的特性,将来还将转向 Py...

红薯
2010/11/04
537
3
python网络基础

代码地址:https://github.com/brandon-rhodes/fopnp/tree/m/ 本书在kindle显示为乱码。 背景: https://github.com/brandon-rhodes/fopnp/tree/m/playground 以下每台机器可以用docker容器实......

磁针石
2016/06/13
393
0
Python学习资料篇

Python学习资料网络上比较多,看到好的资源,不及时记录下来,下次就找不到了,我把知乎上好的回到收藏汇总到这里,以便自己随时查看,包括Python入门书籍,网站,项目,官方文档,下载资源等...

BjarneCpp
2017/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

html之表单

本文转载于:专业的前端网站➞html之表单 表单作用:搜集信息; 组成:提示信息、表单控件、表单线 <form action="1.php" method="post" maxlength="6(最大长度)" readonly="readonly(只读,......

前端老手
8分钟前
6
0
Mybatis之Executor

mybatis-3.4.6.release. 图1 Executor是个接口,具体实现是在BaseExecutor和4个子类中。 1.BatchExecutor BatchExecutor与其它的区别是update方法中,使用的是StatementHandler的batch方法,...

克虏伯
27分钟前
5
0
mysql清空表数据并让自增ID从1开始计数

1 使用truncate命令清空表 Truncate Table test truncate 命令速度比delete的删除更快,而且自动将自增字段重新从1计数 2 pypAmyAdmin中操作选项卡(Operations)中进行修改 ps. 网上一些alt...

编程老陆
35分钟前
4
0
58. 静态工厂方法

参考:https://www.jianshu.com/p/ceb5ec8f1174 https://www.jianshu.com/p/fa15f63d399a 1.定义 用一个静态方法来对外提供自身实例的方法,即为我们所说的静态工厂方法(Static factory met...

20190513
41分钟前
7
0
遇到API安全问题怎么办?F5 API加固解决方案怎么样?

  在各种APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优在以前都采用自已定义的接口和结构,对于公开访问的接口,专业点的都会做...

梅丽莎好
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部