首先把socket.io
和koa2
结合在同一个项目中
还是比较简单的
服务端
import Koa from 'koa';
import http from 'http';
import socket from 'socket.io';
const app = new Koa();
//koa中间件 原代码不动
//app.use(...);
//如果原来是用app.listen(3000);来启动服务,现在要改成用http来启动server
const server = http.createServer(app.callback());
//挂载socket
const io = socket(server);
//监听socket连接
io.on('connection', client => {
})
server.listen(3000);
前端连接socket
import socket from 'socket.io-client';
const io = socket('ws://xxx.xxx.xxx.xxx:3000');
io.on('connect', () => {
})
http相关请求可以通过原来如axios
等方式请求到koa中间件处理与socket.io
互不干涉
socket.io
服务端常用监听操作
//监听客户端连接 每个client对应一个开着的浏览器窗口
io.on('connection', client => {
//捕获客户端send信息
//前端io.send(message)
client.on('message', async function (message) {
})
//捕获客户端自定义信息
//前端io.emit('xxx', message);
client.on('xxx', async function (message) {
})
//监听客户端断开连接
client.on('disconnect', async function () {
})
})
socket.io
服务端分组
//加入分组
client.join(group_id);
//踢出分组
client.leave(group_id);
//列出所有分组
io.sockets.adapter.rooms
socket.io
服务端发送消息
// 'message' 可自定义 会被前端对应的监听接口捕获
//指定消息
//给当前连接发送消息
client.emit('message', message);
//给当前连接发送'message'消息
client.send(message);
//指定id消息
io.sockets.socket(clientId).emit('message', message);
//广播消息
//给除了自己以外的客户端广播消息
client.broadcast.emit('message', message);
//给所有客户端广播消息
io.sockets.emit('message', message);
//对分组中的用户发送信息
//不包括自己
client.broadcast.to(group_id).emit('message', message);
//包括自己
io.sockets.in(group_id).emit('message', message);
关于前端一个用户多个客户端登陆的消息推送方法,我现在采用的是分组方式,客户端连接后获取当前登陆人user_id,具体实现方式比较复杂也没有通用性就不贴了,总结起来就是一句话,连接成功后前端发送一条携带jwt
的身份认证消息,后端认证后获得user_id。
然后通过user_id创建分组client.join(user_id);
,这样对一个用户发送消息通过io.sockets.in(user_id).emit('message', message);
就能下达了,不用管客户是否多端登录