1

Perspective Broker で単純なサーバー応答を実装しようとしています。

可能な実装(可能であれば他の人を提案してください):

クライアントはサーバーにサーバーメソッドを実行するように要求し、サーバーはそれを実行して応答します (メッセージを出力することだけを目的とするクライアントメソッドを実行することによって):

[Client-side]:

class ClientPrint(pb.Referenceable):
    def remote_clientprint(self, message):
        print "Printing the message from the server: ", message

[Server-side]:

class RootServerObject(pb.Root):
    def remote_OneFunc(self, ...):
        ...
        print "Now sending the reply..."
       *get ClientPrint object?*
       clientprintobj.callRemote("clientprint", "this is the reply!")

クライアント側オブジェクトのグラブを実装するにはどうすればよいですか? クライアント側のオブジェクトを取得して印刷専用のクライアント メソッドを呼び出すよりも、サーバーの応答を実装するためのより良い方法はありますか?

返信を実装しようとしている完全なコードは次のとおりです。

[クライアント側]:

from twisted.internet import reactor
from twisted.spread import pb

class Client():
    def __init__(self, addr, port, spec):
        self.addr = None
        self.port = None
        self.SomeData = None

    def connect(self, addr, port):
        factory = pb.PBClientFactory()
        reactor.connectTCP(addr, port, factory)
        def1 = factory.getRootObject()
        def1.addCallbacks(self.got_obj, self.err_obj)

    def got_obj(self, rootsrvobj):
        print "Got root server obj:", rootsrvobj
        self.server = rootsrvobj
        def2 = self.server.callRemote("SomeFunc", SomeData)

    def err_obj(self, reason):
        print "Error getting root server obj:", reason
        self.quit()

def cmdsub(addr, port, SomeData):
    c = Client(addr, port, SomeData)
    c.connect(addr, port)

[サーバ側]:

class RootServerObject(pb.Root):
    def __init__(self):
        self.DataOut = None

    def remote_SomeFunc(self, SomeData):
        self.DataOut = hash(SomeData)
        print "Now sending reply..."
        *implement a reply?*

おそらく、これを簡単にするいくつかのより高度な Twisted (または Twisted PB) 機能があるでしょう。

ドキュメント: https://twistedmatrix.com/documents/12.3.0/core/howto/pb-usage.html#auto3

ありがとう。

4

1 に答える 1

0

これを行う最も簡単な方法は、サーバーが使用する必要があるクライアント側のオブジェクトを取得してサーバーに渡すことです。私が考えることができるほとんどすべてのソリューションは、これを中核としています。

クライアントのgot_objメソッドを次のように変更します。

def got_obj(self, rootsrvobj):
    print "Got root server obj:", rootsrvobj
    self.server = rootsrvobj
    def2 = self.server.callRemote("SomeFunc", self, SomeData)

の実装を次のremote_SomeFuncように変更します。

def remote_SomeFunc(self, client, SomeData):
    self.DataOut = hash(SomeData)
    print "Now sending reply..."
    client.callRemote("client_print", "Here is your reply")

クライアント オブジェクトへの参照を管理するためのより構造化された方法としてTwisted Credを調べたいと思うかもしれませんが、cred は Perspective Broker のまさにこの機能に基づいて構築されており、より抽象的で機能豊富なインターフェイスを提供しています。

ただし、上で「ほぼ」と言ったことに注意してください...

Twisted の Perspective Broker の実装には、Deferred のサポートが十分に統合されていることに注意してください。remote_メソッドが を返した場合、が起動Deferredするまでメソッド呼び出しに応答は送信されず、メソッド呼び出しDeferredの結果として結果が送信されます。によって返された のコールバックにのロジックを入れて、サーバーが返す応答を同期的または非同期的に ( として) 作成することをclient_print検討しください。Deferredself.server.callRemote("SomeFunc", SomeData)remote_SomeFunc Deferred

于 2013-08-13T11:58:02.867 に答える