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

WebSocket使用的是什么网络通信协议

时间:2023-04-03 20:35:14 Node.js

(握手阶段使用的是http1.1),如果服务端需要主动向客户端推送信息可以使用。优点全双工,服务器端和客户端可以相互通信。与各种查询相比,不仅节省了多次握手的消耗,节省了带宽资源,而且不需要多次询问是否有新的数据可以消费。存在的问题需要服务器配合,学习成本较高。如果获取新数据的频率低,一直保持连接,就会浪费服务器资源。使用方法(ps:本人使用本地nginx,自己生成证书,key)技术方案:nodejs+nginx+微信小程序hosts文件配置:127.0.0.1localhost127.0.0.1www.test.comserver:varexpress=require('表达');varws=require('ws');consthttp=require('http');varserver=http.createServer(express());/***创建websocket服务*/constwss=newws.createServer({server,path:'/wss'},ws=>{serveMessage(ws);});/***监听websocket服务错误*/wss.on('error',(err)=>{console.log(err);});/***执行一个简单的WebSocket服务,并回复客户端发送的所有消息*/functionserveMessage(ws){//监听客户端传入消息ws.on('message',(message)=>{console.log(`WebSocketreceived:${message}`);ws.send(`Server:Received(${message})`);});//监听关闭事件ws.on('close',(code,message)=>{console.log(`WebSocketclientclosed(code:${code},message:${message||'none'})`);});//连接成功后立即发送响应80端口也可以):server{server_namewww.test.com;听443;SSL开启;ssl_certificatexxx.crt;#证书ssl_certificate_keyyyy.key;#key,生成方法可以搜索access_log/usr/local/etc/nginx/access.log;#记录访问日志error_log/usr/local/etc/nginx/error.log;#记录错误日志proxy_read_timeout10s;#设置超时时间防止节点服务挂掉proxy_connect_timeout5s;#设置超时时间防止节点服务挂掉location/wss{proxy_passhttp://localhost:8888;proxy_http_version1.1;#需要proxy_set_header升级$http_upgrade;#需要proxy_set_header连接$connection_upgrade;#需要proxy_set_header主机$host;#不需要proxy_set_headerX-Real-IP$remote_addr;#不需要proxy_set_headerX-Real-Port$remote_port;#不需要proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;#不需要proxy_set_headerX-Forwarded-Protocol"$scheme";#不需要}location/{proxy_passhttp://localhost:999;proxy_set_header主机$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerX-Forwarded-Protocol$scheme;}}小程序客户端(ps:具体语法参考mp.weixin.qq.com小程序官方文档):wx.connectSocket({url:'wss://www.test.com/wss',数据:{消息:'测试'},成功:函数(res){console.log('成功',res);},失败:函数(){console.log('失败');}});wx.onSocketOpen(function(res){//balabala,可以向服务器发送消息}wx.onSocketMessage(function(data){//从服务器收到Message,balabala}wx.onSocketError(function(res){//socketerror,balabala}websocket客户端遇到的问题自动关闭链接:原因是长时间没有和websocket服务器通信,超过了nginx设置的proxy_read_timeout时间就会自动关闭。如果想长时间连接,可以用setTimeout等类似工具判断重链断了上游过早关闭连接从上游读取响应头,client:127.0.0.1,server:...:如果nginx确定是正确的,多半是websocket服务器的问题,比如我的,解决方法是将node中的socket.io模块换成ws模块。