【问题标题】:Asynchronous Bidirectional RPC异步双向 RPC
【发布时间】:2011-11-09 17:12:44
【问题描述】:

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

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

有什么建议吗?我看过 bjsonrpc 之类的东西,这似乎是正确的事情,但是服务器似乎无法识别哪些连接;因此,如果用户已经确定了自己的身份,并且来自另一个用户的请求向该用户发送消息,则它不会公开该用户的连接,因此我们可以发送消息。

【问题讨论】:

    标签: python rpc


    【解决方案1】:

    我不完全确定您所说的“事件循环”是什么意思,但您应该查看 RPyC (Python)

    RPyC Project page

    【讨论】:

      【解决方案2】:

      您绝对应该查看Twisted。它是一个基于事件的 Python 网络框架,它实现了一个事件循环(称为“反应器”),支持 select、poll、epoll、kqueue 和 I/O 完成端口,并使用称为 Deferreds 的对象调解异步调用

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

      【讨论】:

        【解决方案3】:

        我是 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)
        

        因此,您可以将登录用户的连接存储在全局变量中,然后调用您想要的任何客户端方法。

        【讨论】:

        • 它可以做服务器到客户端的推送,如果可以,有没有例子?
        【解决方案4】:

        我参与了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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-03
          • 1970-01-01
          • 2012-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-09
          • 1970-01-01
          相关资源
          最近更新 更多