在Twisted透视代理中调用客户端的远程方法

时间:2012-10-07 23:37:03

标签: python twisted perspective-broker

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

如何实现此反向呼叫(PB Server> PB客户端)?比如告诉服务器它必须在客户端回调一个方法...如果它不可能通过PB,那么你建议你去做什么呢?

1 个答案:

答案 0 :(得分:2)

当客户端执行此操作时:

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

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

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