2017-06-15 2 views
1

Jusqu'à présent, j'ai un code de base pour connecter mon serveur websocket à un client websocket. J'utilise Autobahn pour le code du serveur et Advanced REST Client comme client. Dans une méthode distincte de la classe DBAlertProtocol, j'interroge depuis longtemps une base de données dans CouchDB pour tout changement qui se produit, c'est-à-dire ajouter, supprimer, mettre à jour, etc. Cette méthode est appelée 5 secondes après l'ouverture de la connexion websocket.Utiliser sendMessage pour les modifications de CouchDB en utilisant Autobahn WebSocket Library

L'utilisation de sendMessage pose un problème lorsque les données ne s'affichent pas du côté du client ou que l'arrivée est parfois très longue.

Existe-t-il un moyen de modifier les options de communication? Les données peuvent-elles être trop volumineuses pour être envoyées? J'essaye de comprendre pourquoi mes autres exemples peuvent envoyer des données avec succès, mais les notifications de changements de couchdb ne peuvent pas.

Voici le code que j'ai jusqu'à présent.

Merci d'avance!

server.py

import sys 
import logging 
import couchdb 
from twisted.python import log 
from twisted.internet import reactor 

from autobahn.twisted.websocket import WebSocketServerFactory, \ 
         WebSocketServerProtocol, listenWS 
from autobahn.twisted.resource import WebSocketResource 

couch = couchdb.Server("http://localhost:5984/") 
db = couch['event_db'] 

class DBAlertProtocol(WebSocketServerProtocol): 

    def onConnect(self, request): 
    print("Connection made on server side") 

    def onOpen(self): 
    print("WebSocket connection open.") 
    reactor.callLater(5, self.check_db_changes) 

    def check_db_changes(self): 
    since = 1 
    print("\nstart loop\n") 
    while True: 
     changes = db.changes(since=since, include_docs=True) 
     since = changes['last_seq'] 
     no_docs_changed = len(changes) 
     counter = 0 
     for changeset in changes['results']: 
     print("\nChange detected!\n") 
     try: 
      doc = db[changeset['id']] 
     except couchdb.http.ResourceNotFound: 
      print("Resource not found, or was deleted.") 
     else: 
      counter += 1 
      print("Number of docs effected: {}".format(str(counter))) 
      # Send change data to MW 
      self.sendMessage(str(changeset)) 

    def onClose(self, wasClean, code, reason): 
    print("WebSocket closed on server side: {}".format(reason)) 

    def onMessage(self, payload, isBinary): 
    print("Data received from database: {}".format(payload)) 
    self.sendMessage("Message received.") 


class DBAlertFactory(WebSocketServerFactory): 
    protocol = DBAlertProtocol 


def main(): 
    log.startLogging(sys.stdout) 

    port = 8000 

    factory = DBAlertFactory(u"ws://127.0.0.1:8000") 

    listenWS(factory) 
    print("Listening on port: {}".format(str(port))) 
    print("Starting reactor...") 
    reactor.run() 


if __name__ == "__main__": 
    main() 

Répondre

2

check_db_changes donne jamais le contrôle si aucune autre partie de votre programme ne peut jamais fonctionner:

while True: 

Au lieu de cela, essayer quelque chose comme twisted.internet.task.LoopingCall.

+0

C'est en fait ce que j'ai utilisé à la place et fonctionne parfaitement maintenant! Je vous remercie. – Brian