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