参考链接:https://blog.csdn.net/ORANGE_3iING/article/details/140819324
什么是websocket?
全双工通信的协议。与 HTTP 协议不同的是,WebSocket 允许服务器和客户端在连接建立后能够在不需要重新请求的情况下,相互发送数据。即浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。
使用场景
实时通讯的场景如:即时聊天应用、多人在线游戏、股票行情及天气预报等实时数据更新、在线白板工具、协同开发平台、在线协同绘图工具、设计协作平台等
工作原理
握手过程
WebSocket 连接的建立始于客户端的 HTTP 请求。服务器接收到请求后,会进行确认 并切换为 WebSocket 协议,从而建立连接。
握手成功后,HTTP 连接切换为 WebSocket 连接,此时客户端和服务器之间可以进行全双工通信。
数据传输
一旦 WebSocket 连接建立,客户端和服务器之间就可以进行双向的数据传输。
连接关闭
WebSocket 连接可以由客户端或服务器任意一方发起关闭。包括以下步骤:
发送关闭帧:一方发送一个关闭帧,表明希望关闭连接。
确认关闭请求:接收方回应一个关闭帧,确认关闭请求。
完成关闭:在双方都发送关闭帧后,连接正式关闭。客户端和服务器随后释放相关资源。
前端实现
| 12
 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);
 };
 
 | 
| 12
 
 | socket.send('Hello Server!');
 
 | 
| 12
 
 | socket.close(1000, 'Normal closure');
 
 | 
前端进阶
断线重连
| 12
 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);
 }
 
 | 
心跳机制
| 12
 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.服务器端优化:合理配置服务器端的连接数和资源管理,以支持更多的并发连接。