2

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

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

4

1 回答 1

2

当客户这样做时:

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

服务器这样做:

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

wherefindSomeFile返回 的实例,然后 PB 服务器将在触发后向客户Deferred端发送回响应,并在客户端从服务器接收到该响应后触发。serverDeferredclientDeferred

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

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返回的 by将gatherResults触发一个列表,其中Deferred包含传递给它的列表中所有对象的结果。

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

于 2012-10-08T00:44:24.710 回答