Python 使用Twisted透视代理在客户端实现可引用对象

Python 使用Twisted透视代理在客户端实现可引用对象,python,twisted,perspective,broker,Python,Twisted,Perspective,Broker,我试图在透视代理中实现一个简单的服务器应答 可能的实施请尽可能提出其他建议: 客户端请求服务器执行服务器方法,服务器执行,然后通过执行客户端方法进行回复,客户端方法的唯一目的是打印消息: [Client-side]: class ClientPrint(pb.Referenceable): def remote_clientprint(self, message): print "Printing the message from the server: ", mess

我试图在透视代理中实现一个简单的服务器应答

可能的实施请尽可能提出其他建议:

客户端请求服务器执行服务器方法,服务器执行,然后通过执行客户端方法进行回复,客户端方法的唯一目的是打印消息:

[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特性可以让这变得更简单

文件:


谢谢。

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

将客户的got_obj方法更改为类似以下内容:

def got_obj(self, rootsrvobj):
    print "Got root server obj:", rootsrvobj
    self.server = rootsrvobj
    def2 = self.server.callRemote("SomeFunc", self, SomeData)
def remote_SomeFunc(self, client, SomeData):
    self.DataOut = hash(SomeData)
    print "Now sending reply..."
    client.callRemote("client_print", "Here is your reply")
并将远程_SomeFunc的实现更改为类似以下内容:

def got_obj(self, rootsrvobj):
    print "Got root server obj:", rootsrvobj
    self.server = rootsrvobj
    def2 = self.server.callRemote("SomeFunc", self, SomeData)
def remote_SomeFunc(self, client, SomeData):
    self.DataOut = hash(SomeData)
    print "Now sending reply..."
    client.callRemote("client_print", "Here is your reply")
您可能希望以一种更结构化的方式来管理对客户端对象的引用,但cred正是基于透视代理的这一特性来提供其更抽象、更功能化的接口

然而,请注意,我几乎在上面说过

请记住,Twisted的Perspective Broker实现对延迟提供了良好的集成支持。如果远程方法返回延迟,则在延迟触发之前不会向方法调用发送响应,然后将结果作为方法调用的结果发送。您可以考虑将clieldPrand的逻辑放在由Self.Serv.CaldReTeSmithFunc、SoMeDATA返回的延迟回调上,并使服务器的ReleTythAfFunc以延迟或同步方式同步地或异步地返回答复。