Отправка сообщения с одного сервера на другой в Twisted - PullRequest
3 голосов
/ 21 ноября 2011

Я полный нуб Twisted AND 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 + '\n')

Я хочу, чтобы server1 мог передавать сообщения на server2. Скорее я хочу, чтобы server1 рассматривался как клиент server2. Если server1 получает сообщение «привет», я хочу, чтобы оно отправляло точно такое же сообщение на server2. Единственное, что нужно сделать server1, - это отправить сообщение, полученное от его клиента на сервер2.

Как мне это сделать?

ПРИМЕЧАНИЕ. Вы можете полностью изменить способ реализации моего сервера, если это поможет.

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Различные части вашего приложения могут взаимодействовать друг с другом с помощью вызовов методов.

Отправить сообщение на сервер2 на самом деле просто означает Вызов метода для одного из объектов, связанных сserver2 .

Например, в MyChat вы можете иметь:

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

Это предполагает несколько вещей:

  • Вы добавляетеновый otherServers атрибут вашей фабрики.Его содержимое - это объекты, связанные с другими серверами прослушивания, которые вы настроили.Это могут быть объекты фабрики или объекты протокола.Это зависит от того, что наиболее удобно, в зависимости от того, что вы собираетесь делать с сообщением.
  • Вы даете этим связанным объектам новый метод otherServerMessage для обработки сообщений, доставляемых таким образом.Если бы вы доставляли сообщения непосредственно на MyChat.lineReceived (что вы могли бы легко, если бы захотели), тогда я ожидал бы, что вы получите бесконечную рекурсию;другой метод позволяет различать сообщения, полученные от клиента, и сообщения, полученные с другого сервера.
0 голосов
/ 28 июня 2018

Вам нужно просто объявить клиентов внутри вашего сервера, например:

factory = SomeClientFactory('ws://127.0.0.1')            
connectWS(factory)

и в вашем классе клиента:

class SomeClient(WebSocketClientProtocol):

    def __init__(self):
       pass

    def sendCommand(self):    

        self.sendMessage('A message to another server')

    def onOpen(self):
        self.sendCommand()

    def onClose(self, wasClean, code, reason):
        print(reason)

    def onMessage(self, payload, isBinary):
        print('A answer from another server')

class SomeClientFactory(WebSocketClientFactory):

    def __init__(self, url): 
        WebSocketClientFactory.__init__(self,url)

        self.proto = DeltaClient()        
        self.proto.factory = self

    def buildProtocol(self, addr):        
        return self.proto  

Совет: используйте класс «Controller» для управления этими экземплярами клиентов на ваших серверах.

0 голосов
/ 21 ноября 2011

Возможно, вам потребуется реализовать отдельный клиент.Возможно, что объект может быть как клиентом, так и сервером, но я сомневаюсь, что это того стоит, и вы, скорее всего, столкнетесь с проблемами.

Я предлагаю, чтобы сервер создал экземпляр объекта клиента, который выподключиться к «следующему» серверу.Например, клиент может быть переменной экземпляра на сервере.

Пример:

class MyChat(LineReceiver):
    def connectionMade(self):
        print "Proxy: connected"
        factory = protocol.ClientFactory()
        class Proxy(protocol.Protocol):
            def relayMessage(self, msg):
                self.transport.write(msg)
        factory.protocol = Proxy
        point = TCP4ClientEndpoint(reactor, "localhost", 1025)
        conn = point.connect(factory)
        conn.addCallback(self.hasConnection)
    def hasConnection(self, client):
        print "Proxy: Connected to relay", client
        self.client = client
    def lineReceived(self, line):
        print "Proxy: received", repr(line)
        self.client.transport.write(line+"\n")

class MyEcho(LineReceiver):
    def lineReceived(self, line):
        print "Echo:  received", repr(line)

factory = protocol.ServerFactory()
factory.protocol = MyChat
reactor.listenTCP(1024, factory)

factory = protocol.ServerFactory()
factory.protocol = MyEcho
reactor.listenTCP(1025, factory)
...