Client 使用Twisted交互服务器?

Client 使用Twisted交互服务器?,client,twisted,communicate,Client,Twisted,Communicate,我一直在涉猎一些扭曲,我遇到了一个问题。我正在实现一对服务器,它们可以使用telnet localhost x 我的代码是这样处理的: reactor.listenTCP(12001,server1,…) reactor.listenTCP(12002,服务器2,…) 等等 然后使用我的工厂构建协议 我想知道如何让这些服务器彼此交互。例如,假设一个客户端发送一个请求来更新每个服务器上的一个公共值,我希望将该值转发给其他服务器以更新其当前值。我查看了reactor.connectTCP,但这似乎不

我一直在涉猎一些扭曲,我遇到了一个问题。我正在实现一对服务器,它们可以使用
telnet localhost x

我的代码是这样处理的:

reactor.listenTCP(12001,server1,…)

reactor.listenTCP(12002,服务器2,…)
等等

然后使用我的工厂构建协议


我想知道如何让这些服务器彼此交互。例如,假设一个客户端发送一个请求来更新每个服务器上的一个公共值,我希望将该值转发给其他服务器以更新其当前值。我查看了reactor.connectTCP,但这似乎不是我想要的。有没有办法不用telnet命令连接到我的服务器?

当然。为此,请使用普通的Python技术。让我们以正在更新的值为例。我将使其成为一个简单的计数器,可以通过连接到一台服务器和发送到连接到另一台服务器的值来递增:

from twisted.internet import reactor
from twisted.internet.protocol import ServerFactory, Protocol

class Counter(object):
    def __init__(self):
        self._value = 0

    def increment(self):
        self._value += 1

    def get(self):
        return self._value


class Incrementor(Protocol):
    def connectionMade(self):
        self.factory.value.increment()
        self.transport.loseConnection()


class Reporter(Protocol):
    def connectionMade(self):
        self.transport.write("Value is %d\n" % (self.factory.value.get(),))
        self.transport.loseConnection()

server1 = ServerFactory()
server1.protocol = Incrementor

server2 = ServerFactory()
server2.protocol = Reporter

server1.value = server2.value = Value()

reactor.listenTCP(12001, server1)
reactor.listenTCP(12002, server2)
reactor.run()
这两个工厂现在共享一个可变状态。协议可以访问它们的工厂,因为默认的
ServerFactory
将自身设置为它实例化的协议的属性,因此协议也可以在工厂上达到共享的可变状态。一个递增计数器,另一个检索值

您可以通过对非协议、非工厂对象的共享状态和方法调用来构建许多类似的场景