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

Node.js教程第十三篇-WebSocket

时间:2023-04-04 00:45:13 Node.js

重温HTTP协议HTTP协议可以概括几个特点:一次性、无状态的短连接:客户端发起请求,服务端响应,结束。被动响应:只有在客户端请求并给出响应时才执行,不能主动向客户端发起响应。信息安全:服务器必须添加SSL证书,访问时使用HTTPS。跨域:服务器默认不支持跨域,可在服务器上设置支持跨域的代码或相应配置。了解TCPTCP协议可以总结出几个特点:有状态长连接:客户端发起连接请求,服务器响应并建立连接,连接会一直保持到一方主动断开连接。主动:服务端与客户端建立连接后,可以主动向客户端发起调用。信息安全:也可以使用SSL证书进行信息加密,使用WSS进行访问。跨域:默认支持跨域。认识WebSocketWebSocket目前由W3C标准化。WebSocket已经被Firefox4、Chrome4、Opera10.70、Safari5等浏览器所支持。如果我们可以把AJAX请求看作是前端HTTP协议的一种实现,那么WebSocket就是TCP协议的一种实现。服务器端API安装第三方模块ws:npminstallws打开一个WebSocket服务器,端口为8080varsocketServer=require('ws').Server;varwss=newsocketServer({port:8080});Express也可用于打开WebSocket服务器varapp=require('express')();varserver=require('http').Server(app);varsocketServer=require('ws').Server;varwss=newsocketServer({服务器:服务器,端口:8080});用于事件监听connection:连接监听,当客户端连接到服务器时触发事件close:连接断开监听,当客户端与服务器断开连接时触发client向server发送信息send:向客户端推送信息wss.on('connection',function(client){client.on('message',function(_message){var_messageObj=JSON.parse(_message);//status=1表示正常聊天_messageObj.status=1;this.message=_messageObj;//广播客户端消息给所有在线用户wss.broadcast(_messageObj);});//退出聊天client.on('close',function(){try{this.message=this.message||{};//status=0表示退出聊天this.message.status=0;//广播来自客户端的消息致所有在线用户wss.broadcast(this.message);}catch(e){console.log('刷新页面');}});});//定义广播方法wss.broadcast=functionbroadcast(_messageObj){wss.clients.forEach(function(client){client.send(JSON.stringify(_messageObj))});};客户端API在支持WebSocket的浏览器下实例化WebSocket,参数为WebSocket服务器地址。与服务器建立连接if(!WebSocket){$('.connState').text("您的浏览器不支持WebSocket");returnfalse;}//连接到socket服务器varsocket=newWebSocket('ws://localhost:8080');onopen:网络连接建立时触发该事件//监听socket连接socket.onopen=function(){$('.connState').text("服务已连接ws://localhost:8080");}onclose:关闭服务器时触发此事件//监听服务器断开连接socket.onclose=function(){$('.connState').text("服务已断开");socket=null;}close:客户端与服务器断开连接socket.close();onerror:当网络发生错误时触发此事件//监听服务器异常socket.onerror=function(){$('.connState').text("服务错误");套接字=空;}onmessage:收到服务器消息时触发的事件,也是通信中最重要的监听事件。//监听来自服务器消息的广播socket.onmessage=function(msg){varmsgObj=JSON.parse(msg.data);if(msgObj.status==0){$('

'+msgObj.nickname+'['+msgObj.time+']退出聊天

').appendTo('.msgList');}else{$('

'+msgObj.nickname+'['+msgObj.time+']:'+msgObj.message+'

').appendTo('.msgList');}}send:向服务器推送消息varsendMessage=function(_mess){if(socket){varmyDate=newDate();varnow=myDate.getMonth()+'-'+myDate.getDate()+''+myDate.getHours()+':'+myDate.getMinutes()+':'+myDate.getSeconds();varmesObj={昵称:$('#nickName').val(),消息:_mess||$('#mesBox').val(),time:now}//向服务器发送消息socket.send(JSON.stringify(mesObj));}}项目应用本案例为多人聊天室运行步骤npminstallwsnodesocketServer案例思路服务端开通一个服务newsocketServer({port:8080});客户端与服务器建立连接varsocket=newWebSocket('ws://localhost:8080');建造连接时,向服务器发送在线信息socket.send('jointhechat');服务端收到客户端的消息触发message方法,然后将消息广播给所有在线用户。所有客户端接收到来自服务器的广播消息,然后将消息显示在聊天列表中。聊天和退出聊天都是重复客户端发送消息,服务端接受消息然后广播消息给客户端,客户端显示广播消息。