参考链接:https://blog.csdn.net/ORANGE_3iING/article/details/140819324
什么是websocket?
全双工通信的协议。与 HTTP 协议不同的是,WebSocket 允许服务器和客户端在连接建立后能够在不需要重新请求的情况下,相互发送数据。即浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。
使用场景
实时通讯的场景如:即时聊天应用、多人在线游戏、股票行情及天气预报等实时数据更新、在线白板工具、协同开发平台、在线协同绘图工具、设计协作平台等
工作原理
握手过程
WebSocket 连接的建立始于客户端的 HTTP 请求。服务器接收到请求后,会进行确认 并切换为 WebSocket 协议,从而建立连接。
握手成功后,HTTP 连接切换为 WebSocket 连接,此时客户端和服务器之间可以进行全双工通信。
数据传输
一旦 WebSocket 连接建立,客户端和服务器之间就可以进行双向的数据传输。
连接关闭
WebSocket 连接可以由客户端或服务器任意一方发起关闭。包括以下步骤:
发送关闭帧:一方发送一个关闭帧,表明希望关闭连接。
确认关闭请求:接收方回应一个关闭帧,确认关闭请求。
完成关闭:在双方都发送关闭帧后,连接正式关闭。客户端和服务器随后释放相关资源。
前端实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| const socket = new WebSocket('wss://localhost:9527');
socket.onopen = function(event) { console.log('WebSocket 连接已打开'); socket.send('halo啊哈哈哈哈哈哈(*´▽`)ノノ!'); };
socket.onmessage = function(event) { const message = event.data; console.log('接收到消息咯O(∩_∩)O:', message); };
socket.onclose = function(event) { console.log('啊喔…… WebSocket连接已关闭(`・ω・´)'); };
socket.onerror = function(error) { console.error('WebSocket发生错误啦:', error); };
|
1 2
| socket.send('Hello Server!');
|
1 2
| socket.close(1000, 'Normal closure');
|
前端进阶
断线重连
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| socket.onclose = res => { console.log('连接断开'); reconnect() }
function reconnect() { if (isReconnecting) return setTimeout(() => { connected = false isReconnecting = true connect() setTimeout(() => { if (!connected) { isReconnecting = false reconnect() } }, 3000); }, 3000); }
|
心跳机制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| ws.onopen = res => { heartBeat() } ws.onmessage = res => { heartBeat() }
function heartBeat() { sendTimeout && clearTimeout(sendTimeout) msgTimeout && clearTimeout(msgTimeout) sendTimeout = setTimeout(() => { ws.send('heartBeat') msgTimeout = setTimeout(() => { ws.close() }, 5000); }, 5000); }
|
性能优化
1.减少数据量:合理控制传输的数据量,必要时可以对数据进行压缩
2.心跳机制和断线重连:保持连接活跃,提升体验
3.服务器端优化:合理配置服务器端的连接数和资源管理,以支持更多的并发连接。