消息的即时推送——net实现、websocket实现以及socket.io实现

码界捕手漫游
• 阅读 7890

即时通讯

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

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

这三种通信方式都很类似,
服务端:

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

客户端:

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

Websocket实现简单聊天窗口

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

//1、创建服务
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)
    }
}

2、客户端 新建html页面

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> 

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 += '<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中间事件

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)
    }
})

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

这里,如果我新添加一条商品,客户端要实时接收到有新商品了
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))
    }
    ...
}
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
Java WebSocket
本示例的目的,就是通过webSocket向客户端(浏览器端)发送消息.一、什么是WebSocket  WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(fullduplex)通信——允许服务器主动发送信息给客户端。WebSocket通信协议于2011年被IETF(https://www.oschina.n
Stella981 Stella981
3年前
Netty
nettysocketio概述nettysocketio是一个开源的Socket.io服务器端的一个java的实现,它基于Netty框架,可用于服务端推送消息给客户端。说到服务端推送技术,一般会涉及WebSocket,WebSocket是HTML5最新提出的规范,虽然主流浏览器都已经支持,但仍然可能有不兼容的
Stella981 Stella981
3年前
IM客户端消息推送的几种方式及特点
提起消息推送一般人们会经常提起的有以下几种:1.轮询顾名思义,客户端定期去向服务端询问是否有新的消息,简单点说就是服务端不关心客户端的地址是什么,客户端来询问,直接告诉它就行。这种方案最简单,但是却不适用于即时通讯产品,因为即时通讯软件的消息传递机制与一般的消息推送的区别就在即时这点,如果采用轮询的方式,客户端每几秒就连一次服务器,对于手机电量与
Stella981 Stella981
3年前
Android Socket 通信
Androidsocket通信安卓编写Socket客户端,实现连接Socket服务端通信。创建Socket连接并获取服务端数据先创建几个全局变量吧privateBufferedWriterwriternull;Socketsocket;
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java服务端与C#客户端实现websocket通信(发送消息和文件)
设计思路使用websocket通信,客户端采用C开发界面,服务端使用Java开发,最终实现Java服务端向C客户端发送消息和文件,C客户端实现语音广播的功能。Java服务端设计packageservlet.websocket;importjava.io.IOException;importjava
Stella981 Stella981
3年前
RabbitMQ详解(二)
RabbitMQ详解(二)消息通信的概念消息通信,有很多种,邮箱qq微信短信等,这些通信方式都有发送者,接受者,还有一个中间存储离线消息的容器.但是这些通信方式和RabbitMQ的通信模型是不一样的,比如邮件,邮件服务器基于_POP3/SMTP_协议,通信双方需要明确指定,并
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(