消息的即時推送——net實現、websocket實現以及socket.io實現

即時通信

即時通信是一種客戶端與服務端的通訊服務,例如聊天,消息推送等,方式有三種:html

  • node內置net模塊實現的通訊方式
  • WebSocket的通訊方式
  • Socket.io的通訊方式

這三種通訊方式都很相似,
服務端:vue

一、建立服務
二、建立鏈接 拿到客戶端信息
三、服務端廣播數據給各個客戶端
四、服務端關閉鏈接

客戶端:node

一、客戶端鏈接服務器
二、客戶端發送數據
三、客戶端接受服務端數據

Websocket實現簡單聊天窗口

一、服務端 新建文件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

socket.io

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))
    }
    ...
}
相關文章
相關標籤/搜索