3

問題: クライアントが http 要求を送信します。その HTTP 要求に対して、tornado サーバーが外部サーバーへの websocket 接続を開き、時間の経過とともにデータを取得するようにします (データベースに保存する必要があるデータ)。また、トルネード サーバーへの複数のユーザー リクエストを処理できる必要もあります。

これが私の実装です

from twisted.internet import reactor
from autobahn.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS
from tornado.options import define, options, parse_command_line

class IndexHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        self.write("This is your response")
        factory = WebSocketClientFactory("ws://localhost:7096")
        factory.protocol = BridgeSocket
        connectWS(factory)
        self.finish()
        reactor.run()

そして、これが私のソケット接続クラスです:

class BridgeSocket(WebSocketClientProtocol):

    def sendHello(self):
        self.sendMessage("rails")

    def onOpen(self):
        self.sendHello()

    def onMessage(self, msg, binary):
        print "Got echo: " + msg

    def onClose(wasClean,code,reason):
        print "GETTING CLOSE CONNECTION"
        print str(wasClean)+" ---"+str(code)+"---"+str(reason)
        reactor.stop()

ここで、reactor.run() は Tornado Web サーバーへのそれ以上の http 要求を防止するため、websocket の作業が完了して閉じられるとすぐに、reactor.stop() を試しました。しかし、原子炉を再起動することはできないことがわかりました。

アプローチのより良い代替手段や、私が見逃している可能性のあるものはありますか..

4

1 に答える 1

2

TornadoでAutobahnPython から WebSocket クライアントを実行する場合は、Twisted-Tornado 統合 (「Twisted on Tornado」) が必要です -こちらを参照してください。これにより、Tornado 内で Twisted リアクター ループが実行されます。

于 2013-12-18T13:24:07.033 に答える