2017-05-07 8 views
1

Ich habe durch viele Foren und Websites gegangen, aber keine Lösungen gefunden, die mein Problem lösen können.Wie man Payload zu bestimmten Benutzer von Python Autobahn/twisted senden

Ich habe diese server.py Datei:

from autobahn.twisted.websocket import WebSocketServerProtocol, \ 
WebSocketServerFactory 


class MyServerProtocol(WebSocketServerProtocol): 

    def onConnect(self, request): 
     print("Client connecting: {0}".format(request.peer)) 

    def onOpen(self): 
     print("WebSocket connection open.") 

    def onMessage(self, payload, isBinary): 
     if isBinary: 
      print("Binary message received: {0} bytes".format(len(payload))) 
     else: 
      print("Text message received: {0}".format(payload.decode('utf8'))) 
      print("Text message received: {0}".format(self.peer)) 


     # echo back message verbatim 
     self.sendMessage(payload, isBinary) 

    def onClose(self, wasClean, code, reason): 
     print("WebSocket connection closed: {0}".format(reason)) 


if __name__ == '__main__': 

    import sys 

    from twisted.python import log 
    from twisted.internet import reactor 

    log.startLogging(sys.stdout) 

    factory = WebSocketServerFactory(u"ws://127.0.0.1:9000") 
    factory.protocol = MyServerProtocol 
    # factory.setProtocolOptions(maxConnections=2) 

    # note to self: if using putChild, the child must be bytes... 

    reactor.listenTCP(9000, factory) 
    reactor.run() 

Was ich tun möchte, ist innerhalb onMessage möchte ich die Nutzlast von einem Client empfangen und dann die Nutzlast an einen anderen Client senden, ich will nicht, die Payload an den gleichen Client zurückgeben.

Derzeit kann ich die Nutzlast erfolgreich empfangen. Aber wie wird diese Payload an einen anderen Client gesendet?

Ich habe ähnliche Fragen in vielen Seiten gesehen, aber keine von ihnen geholfen.

Antwort

0

Dies ist eine Variation auf der FAQ „How do I make input on one connection result in output on another?

Im Grunde brauchen Sie nur einen Verweis auf das Protokoll für die andere Verbindung, so dass Sie sendMessage auf sie anrufen können. Diese Referenz kann die Form eines Attributs auf Ihrer MyServerProtocol oder auf der Fabrik oder einem anderen Objekt haben. Vielleicht ist es eine direkte Referenz auf eine andere Protokollinstanz oder vielleicht wird es eine Sammlung (eine Liste, ein Diktat, eine Menge) für kompliziertere Interaktionen sein.

Sobald Sie die Referenz haben, rufen Sie einfach sendMessage mit ihm und die Nachricht geht an diese Verbindung anstelle der Verbindung, die self darstellt.

Verwandte Themen