即時通信是一種客戶端與服務端的通訊服務,例如聊天,消息推送等,方式有三種: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)) } ... }