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()
C'est en fait ce que j'ai utilisé à la place et fonctionne parfaitement maintenant! Je vous remercie. – Brian