当前位置: 首页 > 知识库问答 >
问题:

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

宇文嘉勋
2023-03-14

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

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

有没有办法改变通讯选项?数据会不会太大而无法发送?我试图找出为什么我的其他示例可以成功地发送数据,但Couchdb更改通知不能。

下面是我到目前为止的代码。

提前谢谢!

服务器派克

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个答案

谭锐藻
2023-03-14

check_db_changes永远不会放弃控制,所以程序的任何其他部分都不能运行:

while True:

相反,尝试类似于twisted.internet.task.LoopingCall

 类似资料:
  • Apache CouchDB是最新的数据库之一。 CouchDB具有无模式的文档模型,更适合常见应用。可支持非常大数据量查询。 使用CouchDB的主要原因是什么? CouchDB易于使用。 有一个单词可以描述CouchDB - “Relax”。 它也是组成CouchDB官方标志一个单词。 “Apache CouchDB已经开始了,现在是放松时间。” CouchDB具有基于HTTP的REST AP

  • 发送消息到窗口或控件(SendMessage 还会等待回复)。 PostMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText] SendMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle,

  • 我至少读了5篇关于这方面的文章,但我似乎不明白。我有一个xml文件,它已经在浏览器的内存中,我正试图从我的数据库中更新一个文档,我已经有了该文档的文档ID。做这件事最好的方法是什么?jquery.couch.js中是否有对此的支持,因为我似乎找不到任何支持。 为了我的理智起见,我附上了一些带有硬编码值的代码: 我得到一个DOM18错误...但我使用的是一个公共服务器。思想?

  • 主要内容:CouchDB使用Fauxton删除数据库,CouchDB使用cURL工具删除数据库CouchDB使用Fauxton删除数据库 打开Fauxton网址:http://localhost:5984/_utils/ ,如下图所示 - 单击其中一个数据库:,将看到这个数据库所有信息,并点击删除(“Delete Database…”)选项来删除当前数据库(),如下图中所示 - 它将显示一个弹出消息,要求确认数据库名称。如下图中所示 - 点击“Delete”后,数据库就被删除了,列表中再没

  • 主要内容:使用Fauxton创建数据库,CouchDB使用cURL工具创建数据库在CouchDB中,数据库是存储文档的最外层结构。 CouchDB提供cURL实用程序来创建数据库。 您也可以使用的CouchDB Web界面。 使用Fauxton创建数据库 在网络浏览器中打开以下链接: 应该会看到类似下面的一个页面: 点击红色圆圈中的“Create Database”选项卡,创建一个名为“”的数据库。 它将显示一条消息,表示数据库已成功创建。可以在概览(Overview)选项卡

  • 问题内容: 我正在尝试使用Node.js连接到Cloudant上的CouchDB数据库。 这在外壳上起作用: 但是此node.js代码不起作用: 它给了我这些数据: 如何使用Node.js列出我的所有数据库? 问题答案: 内置的Node.js http客户端相当低级,它不支持现成的HTTP Basic身份验证。第二个参数只是一个主机名。它不希望那里有凭据。 您有两种选择: 1.自己构造HTTP基本