异步双向RPC

5 投票
4 回答
5345 浏览
提问于 2025-04-17 01:19

我在找一个可以在Java或Python(更倾向于Python)中使用的RPC库,要求是基于TCP的。它应该支持:

  • 异步处理
  • 双向通信
  • 远程过程调用(RPC)
  • 某种事件循环(带回调或类似的功能)

有没有什么推荐的?我看过一些像bjsonrpc的东西,感觉差不多,但似乎服务器无法识别哪些连接;也就是说,如果一个用户已经登录,而另一个用户发来请求想给这个用户发送消息,服务器就无法找到那个用户的连接,这样就无法发送消息了。

4 个回答

1

我是bjsonrpc的作者。我相信你想做的事情是可以实现的。

不过,有些地方的文档可能写得不太清楚,或者需要一些示例。

简单来说,处理器可以存储内部状态(比如用户是否已认证,或者用户名是什么)。从任何处理器中,你都可以访问“连接”类,这个类包含了实际的socket。

看起来你想要一个聊天的例子。我之前做过类似的事情。我会尽量在新版本中添加一个聊天示例。

关于内部状态的解释可以在这里找到: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)

所以,你可以把已登录用户的连接存储在一个全局变量中,之后可以随时调用你想要的任何客户端方法。

2

我不太确定你说的“事件循环”是什么意思,不过你可以看看这个RPyC(Python的一种库)。

RPyC项目页面

6

你一定要看看 Twisted。这是一个基于事件的Python网络框架,它有一个事件循环的实现(叫做“反应器”),支持多种方式来处理事件,比如select、poll、epoll、kqueue和I/O完成端口。同时,它还通过一种叫做 Deferreds 的对象来处理异步调用。

至于你提到的RPC需求,或许你可以看看Twisted的 PB 库或者 AMP

撰写回答