2011-09-03 66 views
5

我正在寻找使用TCP的Java或Python(Python是首选)的RPC库。它应该支持:异步双向RPC

  • 异步
  • 双向
  • RPC
  • 某种事件循环(与回调或类似)

任何建议?我看过一些像bjsonrpc这样的东西,这似乎是正确的事情,但它似乎没有可能让服务器识别哪些连接;所以如果用户已经识别出他/她自己,并且来自另一用户的请求向该用户发送消息,则它不公开该用户连接,因此我们可以发送该消息。

回答

6

你一定要看看Twisted。这是一个基于事件的Python网络框架,它实现了一个支持select,poll,epoll,kqueue和I/O完成端口的事件循环(称为“reactor”),并用对象调用异步调用Deferreds

至于你的RPC要求,也许你应该看看Twisted的PB库或AMP

1

我是bjsonrpc的作者。我确信有可能用它做你想做的。

有些东西可能记录不完整,或者需要一些例子。

但是,简而言之,处理程序可以存储内部状态(如已验证或未验证,或可能是用户名)。从任何处理程序中,您都可以访问具有套接字本身的“Connection”类。

似乎你想要一个像聊天一样的例子。我过去做过类似的事情。我会尝试为新版本添加聊天示例。

内部状态进行了说明: http://packages.python.org/bjsonrpc/tutorial1/index.html#stateful-server

他们应该被用于认证(但仍然没有提供标准的身份验证方法)。

关于如何从处理程序到达连接类,这还没有记录(对不起),但它有时在源代码中的示例中使用。例如,example1-server.py包含以下公用函数:

def gettotal(self): 
    self._conn.notify.notify("total") 
    return self.value_total 

BaseHandler._conn表示该用户的连接。而正是你当您连接同一类:

conn = bjsonrpc.connect(host=host,port=port,handler_factory=MyHandler) 

所以,你可以登录的用户的连接存储在一个全局变量,后来打电话给你想要的任何客户端的方法。

+0

它可以做服务器到客户端推送,如果是的话,有没有例子吗? –

1

我参与开发Versile Python(VPy),它提供了您请求的功能。它目前作为主要用于测试开发版,但是你可能要检查它。

关于识别用户可以配置远程方法以接收上下文对象这使得该方法以接收关于认证的用户的信息,使用类似于此代码草案语法。

from versile.quick import * 

@doc 
class MessageBox(VExternal): 
    """Dispatches IM messages.""" 
    @publish(show=True, doc=True, ctx=True) 
    def send_message(self, msg, ctx=None): 
     """Sends a message to the message box""" 
     if ctx.identity is None: 
      raise VException('No authenticated user') 
     else: 
      # do something ... 
      pass