nodejs koa2结合socket.io

adminnodejs koa2结合socket.io已关闭评论条评论 844 次浏览

首先把socket.iokoa2结合在同一个项目中
还是比较简单的
服务端

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);就能下达了,不用管客户是否多端登录