异步双向远程过程调用(RPC)

5
我正在寻找一个Java或Python(首选Python)的RPC库,它使用TCP。它应支持:
- 异步 - 双向通信 - RPC - 某种事件循环(带有回调或类似的)
您有任何推荐吗?我已经查看了一些类似bjsonrpc的东西,但它似乎不可能让服务器识别哪些连接;所以如果一个用户已经标识了自己,另一个用户发送消息给该用户时,它不会暴露该用户的连接,因此我们无法发送消息。
4个回答

6
你一定要看看Twisted。它是一个基于事件的Python网络框架,具有实现事件循环(称为“反应器”)来支持select、poll、epoll、kqueue和I/O完成端口,并通过称为Deferreds的对象调解异步调用。
至于RPC需求,也许你应该看看Twisted的PB库或AMP

2
我不是完全确定你所指的“Event loop”的意思,但你应该查看RPyC(Python)。

RPyC项目页面


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)

所以,您可以将已登录用户的连接存储在全局变量中,并随后调用任何客户端方法。

它能进行服务器到客户端的推送吗?如果可以,是否有示例可供参考? - Ali Afshar

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接