nodejs实现服务端长链接webSocker

业务需求

 为了实现服务端主动下发消息给app,
 操作是(前端消息下发--->服务端接收并下发给app-->app端接收)

实现方法(基于koa)

1. 安装依赖

npm install socket.io --save

若情况需要指定版本(2.X)

npm install socket.io@2.0.0 --save

2.代码实现

1⃣️socket.js 文件 封装类

// socket.js 
module.exports = class Sockers {
  constructor () {
    this.instance = null
    this.sockets = new Set()
  }
  // 单例模式
  static getInstance () {
    if (!this.instance) {
      this.instance = new Sockers()
    }
    return this.instance
  }
  add (socket) {
    this.sockets.add(socket)
  }

  del (socket) {
    this.sockets.delete(socket)
  }

  getAll () {
    return this.sockets
  }
}

2⃣️服务端封装的websocket链接方法
websocket.js

//websocket.js
const Sockets = require('./sockets')

const sockets = Sockets.getInstance()

module.exports = {
  initSocketIoServer (app) {
    console.log(sockets)
    const server = require('http').createServer(app.callback())
    const options = { /* ... */ }
    const io = require('socket.io')(server, options)
    //io.of代表长链接调用的后缀名
    io.of('/guide').on('connection', socket => {
      socket.emit('msg', { hello: 'connection success' })// 链接成功
      console.log(sockets.getAll())
      setInterval(() => {
        socket.emit('ydj', { hello: '元旦节快乐' })
      }, 60000) // 哈哈测试一分钟发一次
      sockets.add(socket)// 加入设备到发送长链接
      socket.on('disconnect', () => {
        console.log('断开连接')
        sockets.del(socket)// 断开链接并断开与次设备的联系
      })
    })
    return server
  }
}

3⃣️逻辑处理(在前端触发接口中处理逻辑)

const Sockets = require('../data/socket/sockets')
const sockets = Sockets.getInstance()
  async sendMsg (messageId, tourguide, content) {
  数据来源前端的触发
    if (sockets.getAll().size === 0) {
      // 先判断是否有设备连接 在决定是否发送,避免内存元泄漏
      console.log('已经连接的安卓设备数量为0,群发失败')
    } else {
      for (const socket of sockets.getAll().values()) {
        socket.emit('message', {
          type: 'TEXT',
          messageId: messageId,
          content: content,
          targets: tourguide
        })
      }
    }
    }

4⃣️服务配置 依托koa
server.js

//server.js
const Koa = require('koa');
const { initSocketIoServer } = require('./websocket');
const { Sockets } = require('./sockets');

const app = new Koa();
app.use(require('koa-static')("./"));
const sockets = Sockets.getInstance();
const server = initSocketIoServer(app); // websocket.js

server.listen(3000);

3.github示例项目

websocket长链接项目

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值