WebSocket 和 HTTP 长轮询的区别是什么?如何建立 WebSocket 连接?
请说明 WebSocket 协议的特点,与 HTTP 长轮询的区别,以及前端建立 WebSocket 连接的方法。
回答
我还是少年
WebSocket:全双工通信协议,在 TCP 上建立持久连接,客户端和服务端可以随时互发消息。
建立连接:
const ws = new WebSocket('wss://example.com/socket');
ws.onopen = () => {
ws.send(JSON.stringify({ type: 'join', room: 'chat' }));
};
ws.onmessage = (e) => {
console.log('收到:', JSON.parse(e.data));
};
ws.onerror = (err) => console.error('错误:', err);
ws.onclose = (e) => {
console.log('断开:', e.code, e.reason);
// 自动重连逻辑
setTimeout(reconnect, 3000);
};
// 关闭连接
ws.close(1000, '正常关闭');
与 HTTP 长轮询对比: | 特性 | WebSocket | HTTP 长轮询 | |------|-----------|------------| | 连接方式 | 一次握手,持久连接 | 每次轮询都需要 HTTP 请求+响应 | | 数据方向 | 全双工(双向实时) | 半双工(请求-响应模式) | | 延迟 | 低(毫秒级) | 高(受限于轮询间隔+HTTP开销) | | 服务端推送 | ✅ 原生支持 | ❌ 需模拟(连接保持待响应) | | 开销 | 低(连接建立后头开销极小) | 高(每次请求含完整 HTTP 头) | | 协议 | ws:// / wss:// | http:// / https:// | | 适用场景 | 聊天/游戏/实时协作/行情 | 旧浏览器兼容/低频推送 |
注意:WebSocket 不支持自动重连,需手动实现。推荐库:Socket.IO、SockJS。