簡體   English   中英

使用 socket.io 向特定 socket.id 發送特定消息

[英]Send specific message to specific socket.id with socket.io

我在為我的問題找到正確答案時遇到問題。 如果我可以說,我想為像 Telegram 這樣的每個用戶發送私人消息。 或者像 StackOverflow 上的通知一樣,套接字事件只發送給特定用戶。

io.on('connection', function (socket) {
  // this will be only sent to a user that just connected
  socket.emit('news', { hello: 'world' });
});

但是如何使用自定義 id 發送特定消息?

這是我的socket.js

const socketio = require('socket.io')
const { redis, saveUser } = require('./redis')

module.exports.listen = function(app){
io = socketio.listen(app)

  io.on('connection', socket => {
    console.log('connected user', socket.id)

  socket.on('join', (payload) => {
    redis.get(payload.email (err, socket_id) => {
      socket.broadcast.to(socket_id).emit('join', `Hello ${payload.whoChat.name} Chat you`)
      })
    })      
  })

return io
}

但這不會向我的用戶發送任何內容,如果使用房間,它將直接發送到房間,當我查找文檔io.to()io.broadcast.to()可以與套接字房間一起使用。

所以我決定把它簡單化,但現在我的server.js rigth 是錯誤的。

io.on('connection', function (socket) {
  socket.on('join', payload => {
   socket.emit('join', payload)
})

並在客戶端

socket.on('join', (payload) => { 
    // Compare data from socket with local data if match then push the message 
    // to users who recieve
    if ( payload.userId === localData.userId ) {
        this.message.push(payload.message)
    }
})

但實際上我將它發送給所有用戶......如何正確正確地做到這一點? 以及如何保存用戶socket.id? 由於 socket.id 是隨機生成的,您如何在用戶斷開連接時將其保存以備將來請求?

你需要保持地圖_socket_id / user_id_的

服務器

const sessionsMap = {};

io.on('connection', (socket) => {
  socket.emit('askForUserId');

  socket.on('userIdReceived', (userId) => {
    sessionsMap[userId] = socket.id;
  });

  socket.on('send', (message) => {
    const receiverId = sessionsMap[message.receiverId];
    const messageData = message.data;
    socket.broadcast.to(receiverId).emit('my message', messageData);
  });
});

客戶

const userId = 'FOO';

io.on('askForUserId', () => {
  io.emit(userId);
});

io.on('send', (message) => {
  console.log('You received a message');
  console.log(message.data);
});

筆記

請務必查看Socket.IO 備忘單,它涵蓋了許多命令和用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM