[Python][Tornado] 是不是可以在一个 python 程序中拥有多个不同端口和消息的 websocket?

Posted

技术标签:

【中文标题】[Python][Tornado] 是不是可以在一个 python 程序中拥有多个不同端口和消息的 websocket?【英文标题】:[Python][Tornado] Is it possible to have multi websocket with different port & message in one python program?[Python][Tornado] 是否可以在一个 python 程序中拥有多个不同端口和消息的 websocket? 【发布时间】:2019-01-28 10:03:40 【问题描述】:

我是 Python 的新手。我现在有一个项目,它使用树莓派通过 websocket 连接到本地网络、网络服务器和移动应用程序。两者都是互动的。我现在可以使用 3 个不同的程序分别与他们每个人进行通信。但是当我想将它们集成到 1 中时会遇到一些问题。

我在这里阅读了许多帖子,发现所有答案都建议使用一个列表来存储每个 websocket,并且它们都发送相同的消息。是否可以发送不同的消息?也许是这样的

import tornado.ioloop
import tornado.web
import tornado.websocket

class WebSocketHandler_web(tornado.websocket.WebSocketHandler):
    def __init__(self, application, **kwargs):
        pass

    def open(self):
        # do something

    def on_message(self, msg):
        # do something

    def on_close(self):
        # do something

class WebSocketHandler_mobile(tornado.websocket.WebSocketHandler):
    def __init__(self, application, **kwargs):
        pass

    def open(self):
        # do something

    def on_message(self, msg):
        # do something

    def on_close(self):
        # do something

class WebSocketHandler_server(tornado.websocket.WebSocketHandler):
    def __init__(self, application, **kwargs):
        pass

    def open(self):
        # do something

    def on_message(self, msg):
        # do something

    def on_close(self):
        # do something

app_web    = tornado.web.Application([(r'/ws/', WebSocketHandler_web),])
app_mobile = tornado.web.Application([(r'/ws/', WebSocketHandler_mobile),])
app_server = tornado.web.Application([(r'/ws/', WebSocketHandler_server),])

def main_task():
    # do something
    if(mode == 1):
        webSocket_web.write_message("Mode 1")
    elif(mode == 2):
        webSocket_mobile.write_message("Mode 2")
    elif(mode == 3):
        webSocket_server.write_message("Mode 3")
    # do something

if __name__ == "__main__":
    app_web.listen(7777)
    app_mobile.listen(8888)
    app_server.listen(9999)
    webSocket_web    = WebSocketHandler_web(app_web)
    webSocket_mobile = WebSocketHandler_mobile(app_mobile)
    webSocket_server = WebSocketHandler_server(app_server)
    tornado.ioloop.PeriodicCallback(main_task,1000).start()
    tornado.ioloop.IOLoop.instance.start()

但似乎 websocket.init 需要一个参数请求。那是什么?

【问题讨论】:

似乎在WebSocketHandler类***.com/questions/12479054/…987654321@之外发送消息必须使用列表 【参考方案1】:

是否可以发送不同的消息只需遍历存储的 websocket 列表并发送不同的消息,就这么简单。

init 需要一个参数请求 Tornado 在每个传入请求上创建一个请求处理程序的实例,并将请求传递给 init 以将处理程序绑定到请求。当您在处理程序中覆盖 init 方法时,您应该遵循parent's method interface。不用担心请求参数的值,tornado 会为你传递。

【讨论】:

以上是关于[Python][Tornado] 是不是可以在一个 python 程序中拥有多个不同端口和消息的 websocket?的主要内容,如果未能解决你的问题,请参考以下文章

Python Web 教程之 Tornado 框架入门

面面观 | 使用python tornado web进行开发

Python Tornado篇

python之路45tornado的用法

知乎为啥使用Tornado?使用Python中的多线程特性了吗

python中干掉tornado的连接失败日志