WebSocket与Flask-SocketIO
一、基础知识题
1. 什么是 WebSocket?它解决了什么问题?
参考答案:
WebSocket 是一种基于 TCP 的全双工通信协议。
传统 HTTP 通信模式:
WebSocket 建立连接后:
适用于:
2. WebSocket 和 HTTP 的区别是什么?
3. 什么叫全双工通信?
参考答案:
全双工通信表示:
客户端和服务端都可以同时发送和接收数据。
例如:
而 HTTP 属于半双工模式。
4. Flask 本身支持 WebSocket 吗?
参考答案:
不支持。
需要借助:
扩展实现 WebSocket 功能。
安装:
pip install flask-socketio
二、代码理解题
5. 下面代码的作用是什么?
@socketio.on('message')def handle_message(msg): send(f"收到消息:{msg}", broadcast=True)
参考答案:
作用:
监听客户端发送的 message 事件。
收到消息后:
其中:
表示群发。
6. send() 和 emit() 有什么区别?
参考答案:
send:
用于发送默认 message 事件。
emit:
emit("chat", { "msg": "hello"})
用于发送自定义事件。
实际开发中 emit 使用更多。
7. Flask-SocketIO 中 @socketio.on() 的作用是什么?
参考答案:
用于注册事件监听器。
例如:
表示监听客户端触发的 login 事件。
类似于:
三、实战开发题
8. 如何实现聊天室广播功能?
参考答案:
客户端:
服务端:
@socketio.on('message')def handle_message(msg): send(msg, broadcast=True)
通过:
实现消息广播。
9. 什么是 Room(房间)?
参考答案:
Room 是 SocketIO 的分组机制。
例如:
同一个房间内消息互通。
不同房间互不影响。
10. 如何让用户加入房间?
参考答案:
from flask_socketio import join_roomjoin_room("room1")
或者:
@socketio.on("join_room")def join(data): join_room(data["room"])
11. 如何向指定房间发送消息?
参考答案:
emit( "chat", data, to="room1")
只有 room1 的用户能收到。
12. 如何让用户退出房间?
参考答案:
四、性能与架构题
13. 为什么 WebSocket 比 HTTP 更适合实时系统?
参考答案:
原因:
因此:
14. 如果有 10 万个 WebSocket 连接怎么办?
参考答案:
单机难以支撑。
通常采用:
架构:
Client ↓Nginx ↓WebSocket Server Cluster ↓Redis Pub/Sub
15. 为什么 Flask-SocketIO 推荐 eventlet 或 gevent?
参考答案:
因为 Flask 默认 WSGI 是同步阻塞模型。
大量连接时:
资源消耗大。
eventlet / gevent:
例如:
16. Redis 在 WebSocket 集群中的作用是什么?
参考答案:
作为消息总线。
例如:
服务器A收到消息:
Redis:
所有服务器同步广播。
解决多节点消息同步问题。
五、监控与优化题
17. 如何统计当前在线人数?
参考答案:
连接时:
metrics["connections"] +=1
断开时:
metrics["connections"] -=1
监听:
事件。
18. 如何计算消息延迟?
参考答案:
客户端发送:
服务端收到:
latency=time.time() -timestamp
即可得到延迟。
19. 监控系统中为什么只保留最近100条延迟记录?
if len(samples) > 100: samples.pop(0)
参考答案:
避免:
属于滑动窗口思想。
六、开放性问题(高频)
20. 请设计一个百万级在线聊天室架构。
参考答案方向:
组件:
Nginx
↓
WebSocket Gateway
↓
Redis Cluster
↓
Chat Service
↓
MySQL
实现:
21. WebSocket 连接断开后如何实现自动重连?
参考答案:
前端监听:
定时重连:
setTimeout(connect, 3000)
并增加:
22. WebSocket 如何保证安全?
参考答案:
措施:
综合编程题(面试官最爱)
题目:
请使用 Flask-SocketIO 实现一个简易聊天室,要求:
考察点: