Differences between revisions 1 and 9 (spanning 8 versions)
Revision 1 as of 2006-11-15 13:57:54
Size: 3482
Editor: HuangYi
Comment: 基于allegra的简单rpc实现
Revision 9 as of 2006-11-16 11:57:49
Size: 2537
Editor: ohyha
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
[[TableOfContents]]
== 基于allegra的简单rpc实现 ==
=== async_rpc.py ===
{{{#!python
import pickle
from allegra import (
        async_loop, async_chat,
        async_server, async_client )

def dump_call(funcname, args, kwargs):
    para = (args, kwargs)
    para = pickle.dumps( para )
    data = funcname + '\t' + para
    length = len(data)
    return '%s\r\n%s' % ( hex(length), data )

def parse_call(data):
    funcname, para = data.split('\t', 1)
    para = pickle.loads(para)
    return funcname, para

class Dispatcher(async_chat.Dispatcher):
    ''' the dispatcher for both server and client '''
    terminator = '\r\n'
    def __init__(self, obj):
        super(Dispatcher, self).__init__()
        self.buffer = []
        self.obj = obj
        self.obj.remote = Remote(self.async_chat_push)

    def handle_connect(self):
        self.obj.handle_connected()

    def handle_close(self):
        self.obj.handle_close()

    def collect_incoming_data(self, data):
        self.buffer.append(data)

    def found_terminator(self):
        data = ''.join(self.buffer)
        self.buffer = []
        if not data:
            return
        if self.terminator == '\r\n':
            length = int(data, 16)
            self.set_terminator(length)
        else:
            self.set_terminator('\r\n')
            self.call(data)

    def call(self, data):
        funcname, para = parse_call(data)
        try:
            func = getattr(self.obj, funcname)
        except AttributeError:
            return
        else:
            try:
                func(*para[0], **para[1])
            except TypeError:
                print 'parameter error'

def dispatcher_wrapper(obj):
    def new_obj():
        return Dispatcher(obj)
    return new_obj

class Remote(object):
    ''' wrapper for remote object '''
    def __init__(self, send):
        self.send = send
    def __getattr__(self, name):
        def method(*args, **kw):
            self.send( dump_call( name, args, kw ) )
        return method

def serve(obj, ip, port):
    ''' start a server '''
    return async_server.Listen( dispatcher_wrapper(obj), (ip, port), 6.0, 5 )

def connect(obj, ip, port):
    ''' connect a client '''
    d = Dispatcher(obj)
    return async_client.connect( d, (ip, port), 3)
}}}
=== test_server.py ===
{{{#!python
from allegra import async_loop
from async_rpc import serve

class Temp(object):
    def __init__(self):
        self.remote = None
    def handle_connect(self):
        print 'connected'
    def handle_close(self):
        print 'closed'
    def say(self, str):
        print str
        self.remote.test(1)
    def test(self, a, b=1):
        print a,b

    def __getattr__(self, name):
        def func_wrapper(*args, **kw):
            print 'not implemented method: %s' % name
        return func_wrapper

t = Temp()
serve(t, 'localhost', 9000)
async_loop.dispatch()
}}}
=== test_client.py ===
{{{#!python
from allegra import async_loop
from async_rpc import connect

class Temp(object):
    def handle_connect(self):
        print 'connected'
    def handle_close(self):
        print 'closed'
    def say(self, str):
        print str
        self.remote.say(str)
    def test(self, a, b=1):
        print a,b

t = Temp()
connect(t, 'localhost', 9000)
t.say('hello')
t.remote.test(1,2)
async_loop.dispatch()
}}}
大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!

大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?! 哈哈!大哥小弟,附件不能删除了,还叫什么wiki啊,要人怎么更新阿?!哈哈!

huangyi/simple_rpc_with_allegra (last edited 2009-12-25 07:14:17 by localhost)