socket.io提供基于事件的实时双向通信服务器和客户端连接bindinghttp.Server通过在实例化时传入端口或在实例化后调用listen或attach函数来隐式绑定。Socket.io内部实例化并监听http.Server实例化传入端口letio=require('socket.io')(3000),直接通过listen或attach函数绑定。listen与attach同义letio=require('socket.io')io.listen(3000)//io.attach(3000)表明在http.Server实例化时可以手动指定绑定letserver=require('http').Server();letio=require('socket.io')(server)server.listen(3000)通过listen或attach绑定letserver=require('http').Server();letio=require('socket.io')()io.listen(server)//io.attach(server)server.listen(3000)可以绑定express或者koa等http框架expressletapp=require('express')letserver=require('http').Server(app)letio=require('socket.io')(server)app.listen(3000)koaletapp=require('koa')()letserver=require('http').Server(app.callback())letio=require('socket.io')(server)app.listen(3000)监听连接状态当server和client连接成功后,server会监听Connection和connect事件(connection和connect是同义词),client会监听connect事件,当连接断开时,client对应的server的socket和client都会监听disconnect事件server代码letserver=require('http').Server()letio=require('socket.io')(server)server.listen(3000);io.on('connection',socket=>{console.log('connect')socket.on('断开连接',()=>{console.log('disconnect')})socket.disconnect()})在运行后打印connectdisconnect客户端代码letsocket=io('http://localhost:3000')socket.on('connect',()=>{console.log('connect')})socket.on('disconnect',()=>{console.log('disconnect')})运行后打印connectdisconnect传输数据。服务端和客户端socket关联的是EventEmitter对象,客户端socket发送的事件可以被服务端socket接收,服务端socket发送的事件也可以被客户端接收。基于这种机制,可以实现双向通信。现在模拟这样一种情况:客户端不停地发送随机数。当随机数大于0.95时,服务端延迟1s后向客户端发送警告和警告次数。服务器代码letserver=require('http').Server()letio=require('socket.io')(server)server.listen(3000);io.on('connection',socket=>{socket.on('random',value=>{console.log(value)if(value>0.95){if(typeofsocket.warning==='undefined')socket.warning=0setTimeout(()=>{套接字。emit('warn',++socket.warning)},1000)}})})socket对象可用于存储状态信息和自定义数据,例如socket.warning客户端代码letsocket=io('http://localhost:3000')letinterval=setInterval(()=>{socket.emit('random',Math.random())},500)socket.on('warn',count=>{console.log('warningcount:'+count)})socket.on('disconnect',()=>{clearInterval(interval)})传输流socket.io可以处理流服务器代码io.on('connection',function(socket){letstream=ss.createStream()ss(socket).emit('script',stream)fs.createReadStream(__filename).pipe(stream)})客户端代码letsocket=io('http://localhost:3000')秒s(socket).on('script',stream=>{letbuffer=''stream.on('data',data=>{buffer+=data.toString()})stream.on('end',()=>{console.log(buffer)})})更多文章目录在这里
