面试题答案
一键面试协议层面主要区别
- WebSocket:是一种在单个 TCP 连接上进行全双工通信的协议。它基于 HTTP 协议进行握手(
Upgrade: websocket
),握手成功后,就建立起独立于 HTTP 的持久连接,使用自定义的二进制帧协议传输数据,数据格式较为简单高效。 - Socket.IO:并不是一个真正意义上的协议,它是构建在 WebSocket 等多种传输机制之上的一个库。它在协议层面为了兼容旧浏览器和不同网络环境,采用了多种传输方式,如 WebSocket、XHR 长轮询、JSONP 轮询等。在 WebSocket 不可用时,会自动降级使用其他方式,同时它对传输的数据进行了封装,增加了一些额外的元数据,用于实现可靠传输、心跳检测等功能。
Socket.IO 更具优势的场景
- 兼容性要求高:在需要支持不支持原生 WebSocket 的旧浏览器(如 IE8/9 等)场景下,Socket.IO 可以通过降级策略使用 XHR 长轮询等方式实现实时通信,而 WebSocket 无法直接在这些浏览器上工作。
- 网络环境复杂:在网络不稳定或存在代理、防火墙等限制的环境中,Socket.IO 的自适应传输机制可以确保连接的稳定性。例如在移动网络环境下,信号波动可能导致 WebSocket 连接频繁断开,Socket.IO 可以通过心跳检测和自动重连机制维持连接,保证数据传输的连续性。
- 需要额外功能:当应用需要一些高级功能,如房间(room)管理、消息广播、可靠的消息传输(确保消息一定被送达)等,Socket.IO 提供了内置的支持,而 WebSocket 本身只提供基本的双向通信,要实现这些功能需要开发者自己额外编写大量代码。