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

微信小程序服务器-3-搭建WebSocket服务

时间:2023-04-03 15:28:53 Node.js

知乎:什么是WebSocket,它基于什么?为什么可以实现持久连接?1.安装节点模块。使用ws模块支持服务器上的WebSocket协议。接下来,使用NPM安装:cd/var/www/wxpronpminstallws--save2。实现WebSocket服务器创建websocket.js并实现WebSocket服务//导入ws支持WebSocket实现constws=require('ws');//导出处理方法exports.listen=listen;/***处理HTTP上的WebSocket请求Server*@param{http.Server}server*@param{wafer.SessionMiddleware}sessionMiddleware*/functionlisten(server,sessionMiddleware){//使用HTTPServer创建WebSocket服务,使用path参数指定需要的路径升级到WebSocketconstwss=newws.Server({server,path:'/ws'});//监听WebSocket连接建立wss.on('connection',(ws,request)=>{//HTTP连接升级为WebSocket协议//升级为WebSocket的请求不会被express处理,//需要使用session中间段获取sessionsessionMiddleware(request,null,()=>{constsession=request.session;if(!session){//如果获取不到session,则强制断开WebSocket连接ws.发送(JSON.stringify(request.sessionError)||“没有会话avaliable");ws.close();return;}//保留这个日志的输出允许实验室检查当前步骤是否完成console.log(`WebSocketclientconnectedwithopenId=${session.userInfo.openId}`);serveMessage(ws,session.userInfo);});});//监听WebSocket服务错误wss.on('error',(err)=>{console.log(err);});}/***执行一个简单的WebSocket服务,并回复客户端发送的所有消息*/functionserveMessage(ws,userInfo){//监听客户端发送的消息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'})`);});//之后立即发送connection向会话对应的用户发送hello消息ws.send(`Server:Congratulations,${userInfo.nickName}`);}编辑app.js,调用WebSocket服务//HTTP模块同时支持Express和WebSocketconsthttp=require('http');//引用express支持HTTPServer的实现constexpress=require('express');//引用wafer-session以支持小程序会话constwaferSession=require('wafer-node-session');//使用MongoDB作为会话存储constMongoStore=require('connect-mongo')(waferSession);//导入配置文件constconfig=require('./config');//导入WebSocket服务实现constwebsocket=require('./websocket');//创建一个expressExampleconstapp=express();//express和ws使用独立的会话中间件constsessionMiddleware=waferSession({appId:config.appId,appSecret:config.appSecret,loginPath:'/login',store:新MongoStore({url:`mongodb://${config.mongoUser}:${config.mongoPass}@${config.mongoHost}:${config.mongoPort}/${config.mongoDb}`})});应用程序。use(sessionMiddleware);//在路由/me下,输出session包含的用户信息app.use('/me',(request,response,next)=>{response.json(request.session?request.session.userInfo:{noBody:true});if(request.session){console.log(`WafersessionsuccesswithopenId=${request.session.userInfo.openId}`);}});//实现一个中间件,为未处理的请求输出“Responsefromexpress”app.use((request,response,next)=>{response.write('Responsefromexpress');response.end();});//创建一个HTTPServer而不是使用express直接监听constserver=http.createServer(app);//让WebSocket服务监听创建的HTTP服务器websocket.listen(server,sessionMiddleware);//启动HTTP服务server.listen(config.serverPort);//输出服务器启动日志console.log(`Serverlisteningathttp://127.0.0.1:${config.serverPort}`);3、编辑Nginx配置ssl.conf,添加WebSocket支持#WebSocket配置图$http_upgrade$connection_upgrade{defaultupgrade;''关闭;}服务器{听443;服务器名称www.example.com;#改为证书绑定的域名#sslconfiguresslon;ssl_certificate1_www.example.com.crt;#改为你申请ssl_certificate_key的crt文件名2_www.example.com.key;#改成你申请的密钥文件的名字ssl_session_timeout5m;ssl_protocolsTLSv1TLSv1.1TLSv1。2;ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;ssl_prefer_server_ciphers开启;#WebSocket配置proxy_set_header升级$http_upgrade;proxy_set_header连接$connection_upgrade;位置/{proxy_passhttp://127.0.0.1:8765;}}nginx-tnginx-s重新加载