2017-05-07 1 views
1

J'ai passé par de nombreux forums et sites, mais je n'ai trouvé aucune solution pouvant résoudre mon problème.comment envoyer la charge utile à un utilisateur spécifique par python autobahn/twisted

Je possède ce fichier server.py:

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() 

Ce que je veux faire est à l'intérieur onMessage Je souhaite recevoir la charge utile d'un client, puis envoyer cette charge utile à un autre client, je ne veux pas renvoyer la charge utile au même client.

Actuellement, je peux recevoir la charge utile avec succès. Mais quel est le moyen d'envoyer cette charge à un autre client?

J'ai vu des questions similaires dans de nombreux sites mais aucun d'eux n'a aidé.

Répondre

0

C'est une variation sur la FAQ « How do I make input on one connection result in output on another? »

Essentiellement, vous devez juste une référence au protocole pour l'autre connexion afin que vous puissiez appeler sendMessage là-dessus. Cette référence peut prendre la forme d'un attribut sur votre MyServerProtocol ou sur l'usine ou un autre objet. Peut-être que ce sera une référence directe à une autre instance de protocole ou peut-être que ce sera une collection (une liste, une dict, un ensemble) pour des interactions plus compliquées.

Une fois que vous avez la référence, vous appelez simplement sendMessage avec elle et le message va à cette connexion au lieu de la connexion que représente self.