2017-06-15 9 views
1

これまでのWebSocketクライアントをWebSocketクライアントに接続するための基本コードがあります。私は、サーバーコードにはAutobahn、クライアントとしてAdvanced REST Clientを使用しています。 DBAlertProtocolクラスの別のメソッドでは、CouchDBのデータベースをポーリングして、追加、削除、更新などの変更を行っています。このメソッドは、websocket接続が開いてから5秒後に呼び出されます。Autobahn WebSocketライブラリを使用してCouchDBの変更にsendMessageを使用

sendMessageを使用すると、クライアント側でデータが表示されない場合や、到着に非常に時間がかかる場合があります。

通信オプションを変更する方法はありますか?データが大きすぎて送信できないのでしょうか?私は他の例がデータを正常に送信できる理由を理解しようとしていますが、couchdbの変更通知はできません。

以下は私がこれまで持っていたコードです。

ありがとうございます!

while True: 

代わりに、twisted.internet.task.LoopingCallのようなものを試してください:

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

答えて

2

check_db_changesはので、あなたのプログラムの他の部分は、これまで実行できませんコントロールを放棄することはありません。

+0

これは実際に私が代わりに使用したもので、今は完全に機能しています!ありがとうございました。 – Brian

関連する問題