我一直在尝试一些 Twisted,并且遇到了一个问题。我正在实现几个可以使用
telnet localhost x
连接的服务器
我的代码是这样处理的:
reactor.listenTCP(12001, server1, ....)
reactor.listenTCP(12002, server2, ....)
等等
然后使用我的工厂来构建协议
我想知道如何让这些服务器相互交互。例如,假设客户端发送请求来更新每个服务器上通用的值,并且我想将该值中继到其他服务器以更新其当前值。我研究了
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
有助于将自身设置为它实例化的协议上的属性,因此协议也可以达到工厂上的共享可变状态。一个增加计数器,另一个检索值。
您可以通过对非协议、非工厂对象的共享状态和方法调用来构建许多这样的场景。