Tornado如何处理WebSocket连接?
Tornado 是一个非常流行的 Python Web 服务器和应用程序框架,它以其强大的异步功能而闻名,特别适用于长连接和实时通信场景,比如 WebSocket。
在 Tornado 中处理 WebSocket 连接通常涉及以下步骤:
WebSocketHandler 类:
Tornado 提供了一个tornado.websocket.WebSocketHandler
基类,用于处理 WebSocket 连接。你需要继承这个类并重写几个关键方法以处理连接的不同事件。关键方法:
open(self, *args, **kwargs)
: 当一个新的 WebSocket 连接建立时调用。在这里可以执行一些初始化的操作。on_message(self, message)
: 当接收到来自客户端的消息时调用。你可以在这里处理消息或发送响应。on_close(self)
: 当 WebSocket 连接关闭时调用。这里可以处理一些清理工作。check_origin(self, origin)
: 覆盖此方法以允许 CORS 请求,默认是只接受同源请求。
发送消息:
- 使用
self.write_message(message)
方法发送消息到客户端,这里message
可以是字符串或字典(如果传入字典,Tornado 会将其序列化为 JSON 格式)。
- 使用
异步和协程:
Tornado 的异步特性使得它非常适合处理 WebSocket 这种长连接。你可以利用 @gen.coroutine 或者 async/await 来处理异步的逻辑,比如等待数据库查询、调用外部 API 等。路由配置:
在 Tornado 的Application
对象中需要将你的 WebSocket handler 添加到路由配置中。例如:from tornado.web import Application
from tornado.websocket import WebSocketHandler
class MyWebSocketHandler(WebSocketHandler):
def open(self):
print("WebSocket opened")
def on_message(self, message):
print(f"Received message: {message}")
self.write_message(f"Echo: {message}")
def on_close(self):
print("WebSocket closed")
app = Application([
(r"/websocket", MyWebSocketHandler),
])
运行服务器:
最后,启动 Tornado 的 IOLoop 来运行服务器:if __name__ == "__main__":
port = 8888
app.listen(port)
print(f"Listening on http://localhost:{port}")
tornado.ioloop.IOLoop.current().start()
通过上述步骤,你可以在 Tornado 中轻松实现 WebSocket 服务。在实际应用中,你可能需要根据具体需求处理更多细节,比如安全认证、负载均衡等。