[英]Use sendMessage for CouchDB Changes using Autobahn WebSocket Library
到目前为止,我已经有基本的代码将我的websocket服务器连接到一个websocket客户端。 我将Autobahn用于服务器代码,并将Advanced REST Client作为客户端。 在DBAlertProtocol
类的一个单独方法中,我长时间在CouchDB中轮询数据库是否发生了任何更改,即添加,删除,更新等。打开Websocket连接后5秒钟将调用此方法。
使用sendMessage
存在一个问题,即数据没有显示在客户端,或者有时需要很长时间才能到达。
有没有办法更改通讯选项? 数据太大可能无法发送吗? 我试图弄清楚为什么我的其他示例可以成功发送数据,但是ouchdb更改通知无法成功。
下面是我到目前为止的代码。
提前致谢!
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.