使用Twisted交互服务器?

时间:2011-03-03 03:57:58

标签: client twisted communicate

我在Twisted中遇到过麻烦但我遇到了一个问题。我正在实现一些可以使用telnet localhost x

连接的服务器

我的代码像这样处理它:

reactor.listenTCP(12001, server1, ....)

reactor.listenTCP(12002, server2, ....)

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

我想知道如何让这些服务器相互交互。例如,假设客户端发送请求以更新每个服务器上的公共值,并且我希望将此值中继到其他服务器以更新其当前值。我调查了reactor.connectTCP,但这似乎没有做我想要的。有没有办法连接到我的服务器而不使用telnet命令?

1 个答案:

答案 0 :(得分:0)

不确定。使用普通的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有助于将自己设置为它实例化的协议的属性,因此协议也可以达到工厂的共享可变状态。一个递增计数器,另一个检索值。

您可以使用共享状态和方法调用在非协议的非工厂对象上构建许多这样的场景。