WebSocket 允许客户端和服务器之间持续的双向通信。聊天、实时通知、游戏,WebSocket 是基础。本指南展示了如何在移动应用程序中实现它。
什么是 WebSocket
定义
基于 TCP 的全双工通信协议。
与 HTTP
HTTP:请求/响应。 WebSocket:持久连接。
门
使用 80/443(ws:// 和 wss://)。
双向
服务器无需请求即可发送给客户端。
何时使用
聊天
即时通讯。
通知
实时更新。
合作
多用户编辑。
游戏
同步状态。
仪表板
实时指标。
物联网
与设备通信。
它是如何工作的
握手
从 HTTP 升级到 WebSocket。
连接
已建立持久连接。
框架
数据以帧形式发送。
###关闭
优雅的结束。
后端实现
Node.js
ws,Socket.io。
###Python
websocket、Django 频道。
去
大猩猩 WebSocket。
红宝石
动作电缆(导轨)。
托管
Pusher、Able、Firebase。
套接字.IO
这是什么
抽象 WebSocket 的库。
后备方案
轮询 WebSocket 是否不可用。
###房间
连接分组。
命名空间
逻辑分离。
活动
基于事件的 API。
移动实施
iOS
URLSessionWebSocketTask。红蜘蛛。
###安卓
OkHttpWebSocket。
反应本机
react-native-websocket,Socket.io 客户端。
颤动
web_socket_channel、socket_io_client。
连接管理
###重新连接
自动重新连接。
###心跳
乒乓球以维持生命。
状态
跟踪连接状态。
离线队列
断开连接时对消息进行排队。
身份验证
握手中的令牌
发送身份验证令牌。
验证
服务器在接受之前进行验证。
###刷新
令牌过期处理。
可扩展性
问题
持久连接会消耗资源。
粘性会话
用户始终在同一服务器上。
发布/订阅
Redis 用于服务器之间的通信。
负载均衡
支持 WebSocket 的第 7 层平衡器。
替代方案
服务器发送的事件 (SSE)
单向。服务器→客户端。
长轮询
使用 HTTP 进行实时模拟。
GraphQL 订阅
[GraphQL0下的 WebSocket。
Firebase 实时
托管解决方案。
详细用例
聊天
- 持久连接
- 打字指示器
- 阅读收据
- 存在
实时更新
- 仪表板指标
- 体育成绩
- 股票价格
- 饲料更新
多人游戏
- 游戏状态同步
- 球员位置
- 行动广播
最佳实践
重连逻辑
指数退避。
###心跳
保持连接有效。
消息格式
JSON 或二进制。
压缩
整帧放气。
###安全
需要 WSS (TLS)。
调试
浏览器开发工具
网络选项卡显示帧。
wscat
用于测试的 CLI 工具。
日志记录
记录连接、断开连接、消息。
##性能
连接
每个用户的限制。
有效负载大小
最小化数据。
批处理
尽可能对消息进行分组。
###二进制
对于体积而言,比 JSON 更高效。
常见错误
不要重新连接
连接中断,应用程序崩溃。
内存泄漏
监听器未删除。
没有授权
无需 [身份验证1] 的连接。
忽略断开连接
不处理离线状态。
移动特定
背景
连接在后台关闭。
电池
持续连接会耗尽电池电量。
网络变化
WiFi → 蜂窝网络需要重新连接。
推送回退
当 WebSocket 不可用时使用推送。
结论
WebSocket 对于实时功能至关重要。实施稳健的重新连接、充分的[身份验证2]并考虑对移动电池的影响。在许多情况下,托管服务可以简化。
##常见问题解答
1) WebSocket 比轮询更好吗? 对于实时来说,是的。更少的开销。
2) Firebase 会取代 WebSocket 吗? 在很多情况下是的。它是托管的 WebSocket。
3) WebSocket 是否可以在移动后台工作? 有限。使用推送作为背景。
4) 服务器可以处理多少个连接? 这取决于。数千到数十万的调整。
5) WebSocket 还是 SSE? WebSocket 用于双向。 SSE 仅适用于服务器 → 客户端。
另请阅读
- [应用后端:架构、技术和最佳实践3
- [GraphQL 应用程序:实施指南4
- [应用中的微服务:移动分布式架构5
- [应用程序后端 - 扩展的良好实践6
- [应用程序后端 - 初创公司的良好实践7
- [应用架构:基础知识和基本模式8