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

Vue2.0开发聊天程序(六)服务器端webScoket

时间:2023-04-04 01:21:18 Node.js

吉祥,今晚吃鸡!                   -时隔多日,PUBG终于重拾这个耽搁已久的项目。不是因为我没有时间,也不是因为这个项目对我来说有多难,就一个字——懒。这个项目的背景,当然是选择了node.js来实现。node.js作为前端,比java和php要简单的多。node支持的webSocket在npm中有很多支持webSocket的模块,包括socket.io、node-websocket、faye-websocket-node等,都可以实现webSocket,不过能查到资料最多的应该是套接字。可以参考粉丝日志中各个模块的实现:http://blog.fens.me/nodejs-we...当然这个项目选择的是socket.io,里面的资料很多,很便于使用。socket.iosocket.io安装npminstallsocket.io--save安装在项目中,保存在你的package.json中。socket.io的使用方法很简单,只需要下面两个文件index.jsvarapp=require('http').createServer(handler)//使用node自带的http模块vario=require('socket.io')(app);varfs=require('fs');//node的内置fs模块app.listen(3000);//监听3000端口//定义一个处理器,当访问localhost:3000时,执行这个函数并返回index.html文件functionhandler(req,res){fs.readFile(__dirname+'/index.html',function(err,data){if(err){res.writeHead(500);returnres.end('加载index.html时出错');}res.writeHead(200);res.end(data);});}//监听套接字连接io.on('connection',function(socket){//向网络推送消息socket.emit('news',{hello:'world'});//从网络接收消息socket.on('myotherevent',function(data){console.log(data);});});index.html如果想配合express或者koa框架使用,请参考socket.io文档https:///socket.io/docs/中文版:https://zhuanlan.zhihu.com/p/...API下面介绍socket.io的一些常用API,分为服务端和客户端两部分。Server1.构造器Server实例化一个socket.io对象,可以有两种写法:constio=require('socket.io')();//或者constServer=require('socket.io');constio=newServer();接收两个参数(httpServer,options)[待绑定的服务器,配置项],varapp=require('http').createServer(handler)第一个例子中是一个服务器2.connect和连接事件io.on('连接',(socket)=>{//...});io.on('connection',(socket)=>{//...});当有客户端连接时触发该事件,参数socket为连接客户端的socket对象。3.socket上面说的socket可以看作是与下行客户端通信的桥梁。它属于特定的命名空间(默认为“/”)。socket.id:唯一的会话标识符,来自下行客户端,在向指定客户端发送消息时非常有用//sendtothespecifiedclientio.sockets.connected[socket.id].emit('err','userisexist');socket.rooms:遗传哈希字符串,用于标记当前客户端所在的房间号,以房间名为索引。有了房间机制,可以向同组房间的socket推送消息(可以用来实现群聊)io.on('connection',(socket)=>{socket.join('room237',()=>{letrooms=Objects.keys(socket.rooms);console.log(rooms);//[,'room237']});});socket.use:注册中间件,当有消息流经中间件时,执行中间件中的内容。中间件会接受参数,也可以判断是否阻塞后续中间件的执行。io.on('connection',(socket)=>{socket.use((packet,next)=>{if(packet.doge===true)returnnext();next(newError('Notadogeerror'));});});socket.send:发送消息事件,接收发送内容和回调函数作为参数socket.send('hi',function(data){console.log(data);});//clientsocket.on('message',function(data){console.log(data);})socket.emit:重写/增强EventEmitter.emit方法,触发事件到指定的socket通过事件名称,可以传入任意数量的参数,支持所有可序列化的标准化数据结构。接收参数:eventName(string)args所以序列化数据结构包括bufferack(Function)//简单例子socket.emit('print','helloworld');socket.emit('ferret','tobi',(data)=>{console.log(data);//数据将是'woot'});socket.on:为给定的事件注册一个新的事件处理器。socket.on('news',(data)=>{console.log(data);});//有几个参数socket.on('news',(arg1,arg2,arg3)=>{//...});//orwithacknowledgementsocket.on('news',(data,callback)=>{callback(0);});socket.join:将客户端添加到房间,并执行可选的回调功能。io.on('connection',(socket)=>{socket.join('room237',()=>{letrooms=Objects.keys(socket.rooms);console.log(rooms);//[,'room237']io.to('room237','anewuserhasjoinedtheroom');//广播给房间里的每个人});});socket.leave:from从指定房间移除客户端,可选执行异常回调函数,当客户端连接丢失时,自动从房间移除socket.leave('room237',(res)=>Fornamespaceandroomin{console.log(res)})socket.io,参考文章:http://blog.csdn.net/lijiecon...以上是常用的服务API,socket.io下面介绍客户端的ClientIO:创建socket连接,也可以指定命名空间io('http://localhost/users');//将与http://localhost建立传输连接,而http://Socket.IOconnect将建立与“/users”的连接。还可以提供查询参数:io('http://localhost/users?token=abc')也可以使用多路复用并携带额外的请求标头。详细文档请参考:https://socket.io/docs/client...connect:监听与服务器是否连接成功,接收回调函数constsocket=io('http://localhost');socket.on('connect',()=>{console.log('conncetok');});connect_error:连接错误触发事件处理程序socket.on('connect_error',(error)=>{//...});disconnect:触发事件处理程序socket.on('当连接丢失时disconnect',(timeout)=>{//...});重新连接:成功重新连接时触发事件处理程序socket.on('reconnect',(timeout)=>{//...});Sokect也是一个连接服务器的对象。连接到服务器后,也会生成与服务器socket相同的id。constsocket=io('http://localhost');console.log(socket.id);//undefinedsocket.on('connect',()=>{console.log(socket.id);//'G5p5...'});socket.open()和socket.connect():手动打开socket,可用于连接断开后重连socket.on('disconnect',()=>{socket.open();});socket.emit:发送到服务器,与服务器的emit用法相同socket.emit('ferret','tobi',(data)=>{console.log(data);//datawillbe'woot'});socket.on:注册一个新的响应服务器事件的事件处理程序,与服务器socket的用法相同.on('news',(data)=>{console.log(data);});socket.close()和socket.disconnect():手动关闭客户端与服务端的连接