发送特定的消息到特定的socket.id width socket.io

时间:2019-01-07 14:36:53

标签: node.js websocket 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 装配中出现了错误。

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是随机生成的,当用户断开连接时,如何保存它以备将来使用?

1 个答案:

答案 0 :(得分:1)

您需要维护_socket_id / user_id _

map

服务器

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 cheatsheet,其中涵盖了许多命令和用例。