前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Twisted 与 Tornado 中的 WebSocket 连接问题及解决方案

Twisted 与 Tornado 中的 WebSocket 连接问题及解决方案

原创
作者头像
用户11021319
发布2024-04-23 10:09:35
730
发布2024-04-23 10:09:35

1、问题背景

项目中我们需要通过 Tornado HTTP 处理程序建立WebSocket连接,该连接需要处理多个用户请求,并且将从外部服务器获取的数据存储到数据库中。我们尝试了以下实现:

代码语言:python
复制
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(),又会发现无法重新启动reactor。

2、解决方案

为了在Tornado中运行AutobahnPython的WebSocket客户端,我们需要使用Twisted-Tornado集成(“Twisted on Tornado”)。这个库允许我们在Tornado中运行Twisted reactor循环。

以下是如何使用Twisted on Tornado来解决问题的步骤:

  1. 安装Twisted on Tornado:
代码语言:python
复制
pip install twisted-tornado
  1. 在你的Tornado应用程序中导入Twisted on Tornado:
代码语言:python
复制
from twisted.internet import reactor
from twisted.internet.defer import Deferred
from tornado.ioloop import IOLoop
  1. 在你的Tornado HTTP处理程序中,使用Twisted on Tornado的reactor来运行WebSocket客户端:
代码语言:python
复制
def main():
    reactor.suggestThreadPoolSize(1)  # Increase threadpool size for multiple persistent connections
    IOLoop.instance().run(True)

reactor.callWhenRunning(main)
  1. 修改你的WebSocket客户端协议类,使其继承自Twisted的WebSocketClientFactory:
代码语言:python
复制
class BridgeSocket(WebSocketClientFactory):
    def buildProtocol(self, addr):
        return BridgeSocketProtocol()

class BridgeSocketProtocol(WebSocketClientProtocol):

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

    def onOpen(self):
        self.sendHello()

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

    def onClose(self, wasClean, code, reason):
        print "GETTING CLOSE CONNECTION"
        print str(wasClean)+" ---"+str(code)+"---"+str(reason)
        reactor.stop()
  1. 在你的Tornado应用程序中,使用Twisted on Tornado的reactor来连接到WebSocket服务器:
代码语言:python
复制
from twisted.internet import reactor

def connect_to_websocket():
    factory = BridgeSocket()
    reactor.connectTCP("localhost", 7096, factory)

reactor.callWhenRunning(connect_to_websocket)

这样,我们就可以在Tornado中使用AutobahnPython的WebSocket客户端,而不会阻止对Tornado Web服务器的进一步HTTP请求。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、问题背景
  • 2、解决方案
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档