【发布时间】:2011-11-09 17:12:44
【问题描述】:
我正在寻找使用 TCP 的 Java 或 Python(首选 Python)RPC 库。它应该支持:
- 异步
- 双向
- RPC
- 某种事件循环(带有回调或类似的)
有什么建议吗?我看过 bjsonrpc 之类的东西,这似乎是正确的事情,但是服务器似乎无法识别哪些连接;因此,如果用户已经确定了自己的身份,并且来自另一个用户的请求向该用户发送消息,则它不会公开该用户的连接,因此我们可以发送消息。
【问题讨论】:
我正在寻找使用 TCP 的 Java 或 Python(首选 Python)RPC 库。它应该支持:
有什么建议吗?我看过 bjsonrpc 之类的东西,这似乎是正确的事情,但是服务器似乎无法识别哪些连接;因此,如果用户已经确定了自己的身份,并且来自另一个用户的请求向该用户发送消息,则它不会公开该用户的连接,因此我们可以发送消息。
【问题讨论】:
我不完全确定您所说的“事件循环”是什么意思,但您应该查看 RPyC (Python)
【讨论】:
我是 bjsonrpc 的作者。我相信它可以做你想做的事。
有些事情可能没有很好的文档记录,或者可能需要一些示例。
但是,简而言之,处理程序可以存储内部状态(例如是否经过身份验证,或者可能是用户名)。您可以从任何处理程序访问具有套接字本身的“连接”类。
您似乎想要以聊天为例。我过去做过类似的事情。我将尝试为新版本添加聊天示例。
这里解释了内部状态: 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)
因此,您可以将登录用户的连接存储在全局变量中,然后调用您想要的任何客户端方法。
【讨论】:
我参与了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
【讨论】: