在Twisted中将消息从一台服务器发送到另一台服务器

2022-04-18 00:00:00 python twisted

问题描述

我是一个彻头彻尾的Twisted和Python新手,所以如果我的术语有任何错误或者我所做的任何事情都是愚蠢的,我深表歉意。尽管如此,...

我以以下方式实现了我的服务器:

def makeServer(application, port):
    factory = protocol.ServerFactory()
    factory.protocol = MyChat
    factory.clients = []
    tempServer = internet.TCPServer(port, factory)
    tempServer.setServiceParent(application)
    return tempServer

application = service.Application("chatserver")
server1 = makeServer(application, port=1025)
server2 = makeServer(application, port=1026)
server3 = makeServer(application, port=1027)

请注意,MyChat是一个具有"ReceiveMessage"操作的事件处理类:

def lineReceived(self, line):
    print "received", repr(line)
    for c in self.factory.clients:
       c.transport.write(message + '
')

我希望服务器1能够将消息传递给服务器2。相反,我希望将server1视为server2的客户端。如果服务器1收到消息"hi",则我希望它将相同的消息发送到服务器2。服务器1唯一需要能够做的事情就是将从其客户端接收的消息发送到服务器2。

如何完成此操作?

注意:如果有帮助,您可以完全更改我实施服务器的方式。


解决方案

您的应用程序的不同部分可以使用方法调用彼此交互。

Send a Message to server2实际上只是调用与server2相关的某个对象上的方法。

例如,在MyChat中,您可能具有:

def lineReceived(self, line):
   print "received", repr(line)
   for c in self.factory.clients:
       c.transport.write(message + '
')
   for server in self.factory.otherServers:
       server.otherServerMessage(self, line)

这假设了几件事:

  • 向工厂添加新的otherServers属性。其内容是与您已设置的其他监听服务器相关的对象。这些可能是工厂对象或协议对象。这取决于您打算如何处理邮件,这样做最方便。
  • 您为这些相关对象提供了一个新方法otherServerMessage,以处理以这种方式传递的消息。如果您要将消息直接传递到MyChat.lineReceived(如果您愿意,您可以很容易地将其传递给MyChat.lineReceived),那么我希望您以无限递归结束;使用不同的方法使您能够区分从客户端接收的消息和从另一台服务器接收的消息。

相关文章