【问题标题】:Calling a client's remote method in Twisted perspective broker在 Twisted 透视代理中调用客户端的远程方法
【发布时间】:2012-10-07 23:37:03
【问题描述】:

我正在使用twisted 的Perspective Broker 在客户端和服务器之间进行对话。客户端从服务器请求远程方法“remote_ftp_listen”。这会导致 PB 服务器启动 FTP 连接并等待直到在目录中找到匹配某种模式的文件,然后 PB 服务器必须通知客户端该事件(在所需的 ftp 目录中找到文件)。

如何实现这种反向调用(PB Server > PB client)?比如告诉服务器它必须在客户端回调一个方法......如果通过 PB 无法实现,那么你会建议做什么来实现它?

【问题讨论】:

    标签: python twisted perspective-broker


    【解决方案1】:

    当客户这样做时:

    clientDeferred = server.callRemote("ftp_listen", arguments)
    

    服务器会这样做:

    def remote_ftp_listen(self, arguments):
       # ... some stuff with FTP ...
       serverDeferred = ftpConnection.findSomeFile(arguments)
       return serverDeferred
    

    其中findSomeFile返回Deferred的实例,然后PB服务器将在serverDeferred触发后向客户端发送响应,clientDeferred将在客户端从服务器接收到响应后触发。

    您也可以通过这种方式返回多个结果,如果您很高兴一次返回所有结果(这将在找到最后一个结果时发生)。只需调整服务器:

    from twisted.internet.defer import gatherResults
    
    def remote_ftp_listen(self, arguments):
       # ... some stuff with FTP ...
       serverDeferred = gatherResults([ftpConnection.findSomeFile(a) for a in arguments])
       return serverDeferred
    

    gatherResults 返回的 Deferred 将触发一个列表,其中包含传递给它的列表中所有 Deferred 对象的结果。

    如果您需要在发现结果后立即将结果发送给客户端,而不是将它们全部捆绑到一个结果列表中,那么您需要做一些不同的事情。让客户端将Referenceable 传递给服务器,并让服务器调用该对象上的远程方法。您可以在 PB 文档中的 Twisted 网站上阅读有关此方法的更多信息。 http://twistedmatrix.com/documents/current/core/howto/pb-usage.html 特别提到了这个话题。该文档侧重于将Referenceable 对象从服务器传递到客户端,但反向的工作方式完全相同。因此,如果您在客户端上有一个 Referenceable 并传递给服务器上的 ftp_listen 远程方法,那么服务器将能够转身并使用 callRemote 调用客户端对象上的方法。

    【讨论】:

    • 事实上,我需要让我的服务器在找到文件时回调客户端。 deferred 只能被触发一次,但我需要在找到文件时调用它。当我尝试传递这样的回调时遇到果冻异常: server.callRemote("ftp_listen", arguments, fileFoundCallback)
    • 您的问题是“一个文件”而不是“任意数量的文件”:/ 不过,我会尝试更新答案以处理多个文件。
    猜你喜欢
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多