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

Posted

技术标签:

【中文标题】使用 Autobahn WebSocket 库将 sendMessage 用于 CouchDB 更改【英文标题】:Use sendMessage for CouchDB Changes using Autobahn WebSocket Library 【发布时间】:2017-06-15 18:44:32 【问题描述】:

到目前为止,我已经有了将 websocket 服务器连接到 websocket 客户端的基本代码。我使用 Autobahn 作为服务器代码,并使用 Advanced REST Client 作为客户端。在 DBAlertProtocol 类中的一个单独方法中,我在 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()

【问题讨论】:

【参考方案1】:

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

while True:

请尝试类似twisted.internet.task.LoopingCall

【讨论】:

这实际上是我使用的,现在完美运行!谢谢。

以上是关于使用 Autobahn WebSocket 库将 sendMessage 用于 CouchDB 更改的主要内容,如果未能解决你的问题,请参考以下文章

autobahn.twisted.websocket 打开握手错误 400

如何将 HTTP 请求升级到 Websocket (Autobahn & Twisted Web)

Kubernetes Python客户端:使用Autobahn websocket连接到pod /服务/使用bearer token连接

Websocket Autobahn Testsuite 未处理错误(Windows 和 Ubuntu)

Python - 在单独的子进程或线程中运行 Autobahn|Python asyncio websocket 服务器

Python 安全 websocket 内存消耗