博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
消息的即时推送——net实现、websocket实现以及socket.io实现
阅读量:5797 次
发布时间:2019-06-18

本文共 2762 字,大约阅读时间需要 9 分钟。

即时通讯

即时通讯是一种客户端与服务端的通信服务,例如聊天,消息推送等,方式有三种:

  • node内置net模块实现的通信方式
  • WebSocket的通信方式
  • Socket.io的通信方式

这三种通信方式都很类似,

服务端:

1、创建服务2、创建连接 拿到客户端信息3、服务端广播数据给各个客户端4、服务端关闭连接

客户端:

1、客户端连接服务器2、客户端发送数据3、客户端接受服务端数据

Websocket实现简单聊天窗口

1、服务端 新建文件WsServer.js

//1、创建服务var WebsocketServer = require('ws').Servervar wss = new WebsocketServer({port: 9000})//var clientMap = new Object()var i = 0wss.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)    }}

2、客户端 新建html页面

index.html

Websocket

3、客户端wsClient.js

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 += '
' + event.data}ws.onclose = function(){ console.log('closed')}ws.onerr = function(err){ console.log(err)}在html中引入wsClient.js启动服务端 node WsServer.jsnpm 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中间事件

broadcast.jsconst EventEmitter = require('events').EventEmitterlet broadcast = Object.assign({},EventEmitter.prototype)module.exports = broadcastwwwbroadcast.on('hahaha',function(message){    //将服务端的信息分发给各个客户端    for(var name in clients){        clients[name].send(message)    }})

//如何使用呢?当服务端有新的消息时,我们应该如何订阅到客户端

这里,如果我新添加一条商品,客户端要实时接收到有新商品了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.vueimport bus from '../../event_bus'export default {    data(){        return {            isHasNew = false        }    },    mounted(){        bus.$on('xin', function () {    //接收到服务器端有新数据,那我就提示有新数据楼            this.isHasNew = true        }.bind(this))    }    ...}

转载地址:http://epsfx.baihongyu.com/

你可能感兴趣的文章
[Vim] 搜索模式(正则表达式)
查看>>
#HTTP协议学习# (二)基本认证
查看>>
Android开发之线性布局详解(布局权重)
查看>>
WCF
查看>>
remoting方式
查看>>
django 目录结构修改
查看>>
win8 关闭防火墙
查看>>
OAF_文件系列2_实现OAF导出CSV格式文件ExportButton(案例)
查看>>
Android实例-录音与回放(播放MP3)(XE8+小米2)
查看>>
构建自己的PHP框架--抽象Controller的基类
查看>>
CSS——(2)与标准流盒模型
查看>>
MYSQL 基本SQL语句
查看>>
Codeforces 451E Devu and Flowers(容斥原理)
查看>>
P2P行业专业术语(最全)
查看>>
C#中的Marshal
查看>>
网站发的文章有收录 但是没有排名怎么处理
查看>>
linux命令:ls
查看>>
Using RequireJS in AngularJS Applications
查看>>
hdu 2444(二分图最大匹配)
查看>>
shell编程笔记六:实现ll命令
查看>>