使用Twisted交互服务器?
问题描述:
我一直在一些扭曲,我遇到了一个问题。我执行的是可以连接到使用telnet localhost x
使用Twisted交互服务器?
我的代码处理类似这样的几台服务器:
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
有用地将自己设置为它实例化的协议的属性,所以协议也可以达到工厂上的共享可变状态。一个递增计数器,另一个检索该值。
您可以使用共享的状态和方法调用非协议,非工厂对象来构建像这样的许多场景。