【问题标题】:Implementing Referenceable objects client-side with Twisted Perspective Broker使用 Twisted Perspective Broker 在客户端实现可引用对象
【发布时间】:2013-08-14 05:16:13
【问题描述】:

我正在尝试在 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

谢谢。

【问题讨论】:

    标签: python twisted perspective broker


    【解决方案1】:

    最简单的方法是获取服务器需要使用的客户端对象并将其传递给服务器。几乎所有我能想到的解决方案都以此为核心。

    将您客户的 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 实现对 Deferreds 提供了良好的集成支持。如果remote_ 方法返回Deferred,则在Deferred 触发之前不会向方法调用发送响应,然后结果将作为方法调用的结果发送。您可以考虑将client_print 的逻辑放入self.server.callRemote("SomeFunc", SomeData) 返回的Deferred 上的回调 中,并使服务器的remote_SomeFunc return 同步回复或异步(作为Deferred)。

    【讨论】:

      猜你喜欢
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      相关资源
      最近更新 更多