2

クライアントとサーバー間の通信に twisted の Perspective Broker を使用しています。クライアントはサーバーにリモート メソッド 'remote_ftp_listen' を要求します。これにより、PB サーバーは FTP 接続を開始し、あるパターンに一致するファイルがディレクトリで見つかるまで待機します。その後、PB サーバーはクライアントにそのイベント (目的の ftp ディレクトリでファイルが見つかりました) を通知する必要があります。

このリバース コールを実現する方法 (PB サーバー > PB クライアント) ? クライアント側でメソッドをコールバックする必要があることをサーバーに伝えるようなものです... 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が のインスタンスを返す場合Deferred、PB サーバーは の起動後にクライアントに応答を返し、クライアント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によって返されたは、渡されたリスト内gatherResultsのすべてのオブジェクトの結果を保持するリストで起動します。Deferred

すべての結果を 1 つの結果リストにまとめるのではなく、結果が検出されたらすぐにクライアントに送信する必要がある場合は、別のことを行う必要があります。クライアントReferenceableにサーバーに を渡させ、サーバーにそのオブジェクトのリモート メソッドを呼び出させます。このアプローチの詳細については、Twisted Web サイトの PB ドキュメントを参照してください。 特にhttp://twistedmatrix.com/documents/current/core/howto/pb-usage.htmlはこのトピックに入ります。Referenceableこのドキュメントでは、サーバーからクライアントへのオブジェクトの受け渡しに焦点を当てていますが、その逆もまったく同じように機能します。したがって、サーバー上Referenceableのリモート メソッドに渡すクライアント上に がある場合ftp_listen、サーバーは向きを変えcallRemoteて、クライアント オブジェクト上のメソッドを呼び出すために使用できます。

于 2012-10-08T00:44:24.710 に答える