使用 Autobahn WebSocket 库将 sendMessage 用于 CouchDB 更改

Use sendMessage for CouchDB Changes using Autobahn WebSocket Library

到目前为止,我已经有了将我的 websocket 服务器连接到 websocket 客户端的基本代码。我使用 Autobahn 作为服务器代码,使用 Advanced REST Client 作为客户端。在 DBAlertProtocol class 中的一个单独方法中,我长时间轮询 CouchDB 中的数据库以了解发生的任何更改,即添加、删除、更新等。此方法在 websocket 连接建立后 5 秒被调用打开。

使用 sendMessage 时出现问题,数据未显示在客户端,或者有时需要很长时间才能到达。

有没有办法改变通讯选项?数据是否太大而无法发送?我想弄清楚为什么我的其他示例可以成功发送数据,但 couchdb 更改通知不能。

下面是我目前的代码。

提前致谢!

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

check_db_changes 永远不会放弃控制,因此您程序的任何其他部分都不会 运行:

while True:

改为尝试 twisted.internet.task.LoopingCall