我正在使用twisted 的透视代理在客户端和服务器之间进行通信。客户端从服务器请求远程方法“remote_ftp_listen”。这会导致 PB 服务器启动 FTP 连接并等待直到在目录中找到与某种模式匹配的文件,然后 PB 服务器必须通知客户端该事件(在所需的 ftp 目录中找到文件)。
如何实现这种反向调用(PB Server > PB client)?比如告诉服务器它必须在客户端回调一个方法......如果通过 PB 不可能,那么你会建议做什么来实现它?
我正在使用twisted 的透视代理在客户端和服务器之间进行通信。客户端从服务器请求远程方法“remote_ftp_listen”。这会导致 PB 服务器启动 FTP 连接并等待直到在目录中找到与某种模式匹配的文件,然后 PB 服务器必须通知客户端该事件(在所需的 ftp 目录中找到文件)。
如何实现这种反向调用(PB Server > PB client)?比如告诉服务器它必须在客户端回调一个方法......如果通过 PB 不可能,那么你会建议做什么来实现它?
当客户这样做时:
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
端发送回响应,并在客户端从服务器接收到该响应后触发。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
返回的 by将gatherResults
触发一个列表,其中Deferred
包含传递给它的列表中所有对象的结果。
如果您需要在发现结果后立即将结果发送给客户端,而不是将它们全部捆绑到一个结果列表中,那么您需要做一些不同的事情。让客户端将 a 传递Referenceable
给服务器并让服务器调用该对象上的远程方法。您可以在 PB 文档中的 Twisted 网站上阅读有关此方法的更多信息。 http://twistedmatrix.com/documents/current/core/howto/pb-usage.html特别谈到了这个话题。该文档侧重于将Referenceable
对象从服务器传递到客户端,但反向的工作方式完全相同。因此,如果您Referenceable
在客户端上有一个传递给服务器上的ftp_listen
远程方法的方法,那么服务器将能够转身并使用它callRemote
来调用客户端对象上的方法。