使用 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 服务器