如何使用 Tornado 向 Web 套接字发送消息

Posted

技术标签:

【中文标题】如何使用 Tornado 向 Web 套接字发送消息【英文标题】:How do I send message to web socket with Tornado 【发布时间】:2017-09-20 19:45:09 【问题描述】:

您好,我在后端使用TornadoDjango 框架来处理前端的套接字消息。我对我的项目不太熟悉,但我的项目中有一个文件,其中有实现websocket.WebSocketHandlerweb.Application 的类。这是此文件的一部分

class Application(web.Application):
    """
    Main Class for this application holding everything together.
    """
    def __init__(self):
        PROJECT_NAME = os.path.basename(os.getcwd())
        os.environ['DJANGO_SETTINGS_MODULE'] = PROJECT_NAME + 'tutorial/settings'

        # Handlers defining the url routing.
        handlers = [
            ('/room', SocketHandler),
            ('/room/([a-zA-Z0-9|=%]*)$', SocketHandler),
            ('/video_call', VideoCallSocketHandler),
            ('/video_call/([a-zA-Z0-9|=%]*)$', VideoCallSocketHandler),
        ]

在前端部分是一个函数:

var ws = new WebSocket('wss://domain.com:9003/video_call/' + conferenceId);

ws.onmessage = function (ev) 
    window.location.replace(redirectUrl);
;

我相信这个函数会从我们的移动应用程序中获取消息。

所以问题是我想从我的 python 视图发送消息到这个 url 或 'wss://domain.com:9003/video_call/' + conferenceId

例如:

def some_view_function(request, **kwargs):
    conference_id = request.GET.data['conferenceId']
    ...
    if something:
       send message to wss://domain.com:9003/video_call/' + conference_id

我该怎么做?

【问题讨论】:

【参考方案1】:

tornado 的 wrap django 代码怎么样?

def main():
    os.environ['DJANGO_SETTINGS_MODULE'] = 'docs.settings'
    application = get_wsgi_application()
    container = tornado.wsgi.WSGIContainer(application)

    tornado_app = tornado.web.Application(
       [('.*', tornado.web.FallbackHandler, dict(fallback=container))],        
    )

    server = tornado.httpserver.HTTPServer(tornado_app)
    server.bind(8888)
    server.start(0)
    tornado.ioloop.IOLoop.instance().start()

django和tornado之间的通信我建议通过队列进行通信,比如Redis。

def some_view_function(request, **kwargs):
    conference_id = request.GET.data['conferenceId']
    ...
    if something:
       send_to_queue()

在龙卷风侧队列监听器上。

【讨论】:

如何在send_to_queue 中定义conference_id。函数如何知道WebSocket 向哪个@发送消息?

以上是关于如何使用 Tornado 向 Web 套接字发送消息的主要内容,如果未能解决你的问题,请参考以下文章

使用 Web 套接字的 Tornado 单元测试 - 堆栈上下文呢?

Spring引导Web套接字,无需向特定用户发送消息

从另一个线程向 uWebSockets 0.15.x 套接字发送数据

通过php 向tornado websocket 服务器发送消息?

我的 json 应该是啥样的?使用 Web 套接字发送消息

如何使用 C++ 套接字编程同时向多个服务器发送数据?