即时通信是一种客户端与服务端的通讯服务,例如聊天,消息推送等,方式有三种:html
这三种通讯方式都很相似,
服务端:vue
一、建立服务 二、建立链接 拿到客户端信息 三、服务端广播数据给各个客户端 四、服务端关闭链接
客户端:node
一、客户端链接服务器 二、客户端发送数据 三、客户端接受服务端数据
一、服务端 新建文件WsServer.jsweb
//一、建立服务 var WebsocketServer = require('ws').Server var wss = new WebsocketServer({port: 9000}) // var clientMap = new Object() var i = 0 wss.on('connection',funciton(ws){ console.log(ws + '上线啦') ws.name = ++i clientMap[ws.name] = ws //接收客户端数据 ws.on('message',function(msg){ broadcast(msg, ws) }) //客户端关闭监听 ws.on('close',function(){ delete clientMap[ws.name] console.log(ws.name + '离开') }) }) function broadcast(msg, ws){ for(var key in clientMap){ clientMap[key].send(ws.name + '说' + msg) } }
二、客户端 新建html页面npm
index.html <h1>Websocket</h1> <div id='chatroom'></div> <input type="text" name= "sayinput" id='sayinput' value/> <input type="button" name="send" id="send" value="发送"> <script src="./wsClient.js"></script> <script> function send(){ var sayinput = document.querySelector('#sayinput') ws.send(sayinput.value) //发送信息 sayinput.value = '' } document.querySelector('#send').onclick = function(){ send() } document.body.onkeup = function(event){ if(event.keyCode == 13){ send() } } </script>
三、客户端wsClient.jsjson
var ws = new WebSocket('ws://10.0.0.1:9000/') ws.onopen = function(){ ws.send('你们好') } ws.onmessage = function(event){ var chatroom = document.querySelector('#chatroom') chatroom.innerHTML += '<br/>' + event.data } ws.onclose = function(){ console.log('closed') } ws.onerr = function(err){ console.log(err) } 在html中引入wsClient.js 启动服务端 node WsServer.js npm init cnpm i ws -D
Websocket毕竟是H5新出的,有浏览器的兼容性,因此咱们通常用socket.io这种通信方式,支持websocket的通讯协议,又能够兼容ie浏览器浏览器
(1) 服务端
启动一个node服务,并绑定connection事件来连接客户端
www 中配置服务器
var http = require('http') var server = http.createServer(app) //启动一个服务 var io = require('socket.io')(server) var broadcast = require('./broadcast') var clients = {} var count = 0; io.on('connection',(socket)=>{ socket.name = ++count; clients[socket.name] = socket socket.on('disconnect',()=>{ delete clients[socket.name] //断开连接 }) })
//如何将服务器的数据派发到各个客户端呢,咱们这里定义一个broadcast中间事件websocket
broadcast.js const EventEmitter = require('events').EventEmitter let broadcast = Object.assign({},EventEmitter.prototype) module.exports = broadcast www broadcast.on('hahaha',function(message){ //将服务端的信息分发给各个客户端 for(var name in clients){ clients[name].send(message) } })
//如何使用呢?当服务端有新的消息时,咱们应该如何订阅到客户端app
这里,若是我新添加一条商品,客户端要实时接收到有新商品了 willSaveProducts.save().then(()=>{ broadcast.emit('hahaha','xin') console.log('添加成功') res.json(getParam({success:true})) })
(2) 客户端
定义bus总线,进行传参
import Vue from 'vue' const event_bus = new Vue() export default event_bus
创建连接 并接受服务端传过来的信息
import bus from '../event_bus' const socket = io.connect('http://localhost:3000') socket.on('message',(message)=>{ bus.$emit(message) })
组件 调用 接收传过来的参数 根据参数来响应
main.vue import bus from '../../event_bus' export default { data(){ return { isHasNew = false } }, mounted(){ bus.$on('xin', function () { //接收到服务器端有新数据,那我就提示有新数据楼 this.isHasNew = true }.bind(this)) } ... }