nodejs koa2結合socket.io踩坑記錄,中文文檔

首先把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);就能下達了,不用管客戶是否多端登錄


 轉自https://www.jianshu.com/p/498e5528f9e2

發佈了39 篇原創文章 · 獲贊 68 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章