Tornado WebSocket 问题

1 投票
2 回答
3468 浏览
提问于 2025-04-16 17:02

我最终决定使用Tornado作为WebSocket服务器,但我有个问题想问问它是怎么实现的。

我跟着一个基础教程创建了一个可以工作的服务器,最后得到了这个:

#!/usr/bin/env python

from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.web import Application
from tornado.websocket import WebSocketHandler

class Handler(WebSocketHandler):
        def open(self):
            print "New connection opened."

        def on_message(self, message):
                print message


        def on_close(self):
                print "Connection closed."

print "Server started."
HTTPServer(Application([("/", Handler)])).listen(1024)
IOLoop.instance().start()

它运行得很好,但我在想其他模块(tornado.httpserver、tornado.ioloop和tornado.web)是否真的需要来运行这个服务器。

有这些模块并不是个大问题,但我只是想确认一下,是否有更好的方法来完成它们的功能(我还没有学习过这些模块)。

2 个回答

1

是的,这些导入是必要的,因为你在用到每一个你引用的模块或包里的内容。如果你在代码的开头引用了某个东西,但在后面的代码中根本没有用到它,那当然就不需要导入了。但在这种情况下,你确实用到了你的导入。

6
  • tornado.httpserver :

    1. 这是一个非阻塞的单线程 HTTP 服务器。
    2. 通常情况下,应用程序与 HTTPServer 类的直接交互很少。
    3. HTTPServer 是一个非常基础的连接处理器。除了解析 HTTP 请求的主体和头部之外,HTTPServer 实现的唯一 HTTP 语义就是支持 HTTP/1.1 的保持连接(keep-alive connections)。
  • tornado.ioloop :

    1. 这是一个用于非阻塞套接字的输入/输出事件循环。
    2. 因此,ioloop 可以用来设置响应的超时时间
    3. 一般来说,RequestHandler 和 tornado 中的其他地方的方法不是线程安全的。特别是,像 write()、finish() 和 flush() 这些方法只能在主线程中调用。如果你使用多个线程,重要的是在完成请求之前使用IOLoop.add_callback 将控制权转回主线程。
  • tornado.web :

    1. 提供了RequestHandlerApplication 类。
    2. 帮助提供额外的工具和优化,以利用 Tornado 的非阻塞 web 服务器和工具。
    3. 这个模块提供了以下功能:
      • 入口点:用于子类初始化的钩子。
      • 输入
      • 输出
      • Cookies

希望这些内容能涵盖你遗漏的模块。

撰写回答