【问题标题】:Using Autobahn/Twisted to establish a websocket connection in Tornado HTTP Handler使用 Autobahn/Twisted 在 Tornado HTTP Handler 中建立 websocket 连接
【发布时间】:2013-12-18 12:13:45
【问题描述】:

问题: 客户端发送一个 http 请求。对于那个 HTTP 请求,我希望我的 tornado 服务器打开到外部服务器的 websocket 连接并超时获取一些数据。(我需要存储在数据库中的数据)。我还需要能够处理对 tornado 服务器的多个用户请求。

这是我的实现

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

这是我的 Socket 连接类:

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()。但是现在我发现不能重启reactor。

有没有更好的替代方法或我可能遗漏的任何东西..

【问题讨论】:

    标签: python websocket twisted tornado autobahn


    【解决方案1】:

    如果您想从 AutobahnPython Tornado 下运行 WebSocket 客户端,则需要 Twisted-Tornado 集成(“Twisted on Tornado”) - 请参阅 here。这在 Tornado 中运行了一个 Twisted reactor 循环。

    【讨论】:

    • 谢谢。完美运行。我有另一个问题。我希望我的外部服务器(Tornado)能够处理多个 websocket 连接。我在我的外部服务器上的 onMessage() 中使用 self.producer_queue.join(),这会阻止 IOLoop 并阻止另一个连接,直到队列完成。
    • 对不起,我不使用 Tornado,所以我不知道。您可能想问一个单独的问题,仅标记为 tornado 等,以便引起注意..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多