Tornado WebSocket 问题
我最终决定使用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 :
- 这是一个非阻塞的单线程 HTTP 服务器。
- 通常情况下,应用程序与 HTTPServer 类的直接交互很少。
- HTTPServer 是一个非常基础的连接处理器。除了解析 HTTP 请求的主体和头部之外,HTTPServer 实现的唯一 HTTP 语义就是支持 HTTP/1.1 的保持连接(keep-alive connections)。
tornado.ioloop :
- 这是一个用于非阻塞套接字的输入/输出事件循环。
- 因此,ioloop 可以用来设置响应的超时时间。
- 一般来说,RequestHandler 和 tornado 中的其他地方的方法不是线程安全的。特别是,像 write()、finish() 和 flush() 这些方法只能在主线程中调用。如果你使用多个线程,重要的是在完成请求之前使用IOLoop.add_callback 将控制权转回主线程。
tornado.web :
- 提供了RequestHandler 和 Application 类。
- 帮助提供额外的工具和优化,以利用 Tornado 的非阻塞 web 服务器和工具。
- 这个模块提供了以下功能:
- 入口点:用于子类初始化的钩子。
- 输入
- 输出
- Cookies
希望这些内容能涵盖你遗漏的模块。