当前位置: 首页 > 后端技术 > Node.js

Node.js在websocket中的应用

时间:2023-04-03 17:52:08 Node.js

介绍WebSocket协议诞生于2008年,2011年成为国际标准,所有浏览器都已经支持。它最大的特点是服务端可以主动向客户端推送信息,客户端也可以主动向服务端发送信息。是真正的双向平等对话,属于服务器推送技术的一种。其他特点包括:(1)基于TCP协议,服务器端实现相对容易。(2)与HTTP协议有很好的兼容性。默认的端口也是80和443,而且握手阶段使用的是HTTP协议,所以在握手的时候不容易屏蔽,可以通过各种HTTP代理服务器。(3)数据格式比较轻,性能开销小,通信效率高。(4)可以发送文本或二进制数据。(5)没有同源限制,客户端可以和任何服务器通信。(6)协议标识符为ws(如果加密则为wss),服务器URL为URL。就绪状态常量值描述CONNECTING0连接尚未打开。OPEN1连接已打开并准备通信。CLOSING2连接正在关闭。CLOSED3连接已关闭。坑点:websocket.readyState===3这里没有close生命周期断开即使解决方案在websocket/ws框架中,也会有open、message、close和error生命周期。可以在close生命周期执行reconnect流程,参考最高赞答案。然后在错误生命周期中打印崩溃日志。由于错误一定会触发关闭,所以只需要在关闭生命周期中执行reconnect方法即可。ws.on("close",functionclose(){console.log("aiconnectclose");reconnect();///每5s重新连接一次});ws.on("error",functionerror(error){console.log("aiconnecterror",error);errorLogger.error("aiconnecterror",error);//打印崩溃日志ws.close()});readyState=3不会触发close生命周期,所以需要单独处理。一旦检测到为3,终止()websocket。当然还有另外一种方案,因为websocket中有心跳包。详情参见Howtodetectandclosebrokenconnections?,可以在收到其他socketServers的'pong'信号后写一个定时器,终止socketif(message==='pong'){clearTimeout(aliveInterval);aliveInterval=setTimeout(function(){wsObj.wsAI.terminate()},10000+1000)}ws/websocket官方提示:使用WebSocket#terminate(),它立即销毁连接,而不是WebSocket#close(),它等待关闭计时器。我的理解:terminate()可以立即销毁连接,如果是close(),说明还需要等待close任务工程Tips:我们在搭建websocketServer的时候,经常会遇到socket.readyStat在e=0的情况下,会报Error:WebSocketisnotopen:readyState0(CONNECTING),所以我们在与各个socket通信时,可以增加前提ws.readyState===1再执行ws.send(),否则套接字被中断。如果套接字发送方不重新连接套接字,服务就会崩溃。我们可以实时检测是否有readyState===2或readyState===3的socket连接,并主动执行ws.terminate(),因为在实战过程中,发现某个socket状态继续是2(也就是关闭)而不是3(关闭)最后放两个websocketnodejs框架1https://socket.io/https://github.com/websockets/ws