代码之家  ›  专栏  ›  技术社区  ›  mandaputtra

向特定socket.id width socket.io发送特定消息

  •  1
  • mandaputtra  · 技术社区  · 7 年前

    我很难找到我问题的正确答案。如果可以的话,我想为每个用户都提供私人信息,比如电报。或者像stackoverflow上的通知一样,socket事件只发送给特定的用户。

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

    但是如何使用自定义ID发送特定的消息呢?

    这里我的 Sjk.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() 可用于带插座的房间。

    所以我决定简单点,但在这里错了我的 服务器,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 回复  |  直到 7 年前
        1
  •  1
  •   molamk    7 年前

    你需要保持 地图 共_socket_id/用户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 cheatsheet 它涵盖了许多命令和用例。

    推荐文章