您如何向特定房间的特定用户发送信息

时间:2020-09-02 09:53:45

标签: node.js socket.io

大家好,我需要使用socket.io向特定房间中的特定用户发送数据的帮助,正在使用Redis存储创建组的管理员的ID,但是我如何从Redis获取用户ID并发出在他们房间里给他们

我的代码

const users = {} 
const admins = {}


io.on('connection',socket =>{

socket.on('create-class',(address,userID)=>{
  client.hmset(`${userID}`, `id`, `${userID}`); 
})


socket.on('join-class',(classId,palsid)=>{
  
      socket.join(classId)
      client.hgetall(`${palsid}`, function(err, object) {
        if(err)throw err
          
          if(object !==null){
            admins[socket.id] = object.id 
          }
         
           socket.to(classId).broadcast.emit('user-connected',palsid)
       
    });                    
     
      

      //on disconnection
      socket.on('disconnect',()=>{
          socket.to(classId).broadcast.emit('user-disconnect',palsid)
      })

   
  })

2 个答案:

答案 0 :(得分:0)

基于OP提供的信息,我只能给出一些指示。

首先,您需要获取套接字(特定用户),最好是通过其ID。

const socket = io.sockets.connected[socketid];

那你就发射到这个插座

socket.emit("message", "hello world");

这应该向一个特定的套接字(用户)发送一条消息,而与它所在的房间无关。这仍然留下了在哪里获取套接字ID的问题,但是要回答,我们需要有关您的代码/设置/的更多信息应用程式。通常,套接字ID保留在某种类型的存储/数据库或内存中。

保留对套接字ID的引用

现在,套接字ID是临时的。每当套接字连接时,它都会获得不同的套接字ID。如果套接字ID是临时的,如何识别某个套接字的特定用户?

A:使用非临时性存储对套接字ID的引用

当用户连接到Websocket服务器时,他/她有可能会与唯一的用户ID一起进行连接。如果您有一个用户数据库,则它们都具有唯一的标识符(通常)。当套接字连接时,将此标识符与套接字ID一起保存,您将在以后的任何时间使用唯一的用户标识符对套接字进行引用。套接字连接时如何传递诸如用户ID之类的较长信息有多种方法:例如,可以使用查询令牌:

// client side
const ioClient = require('socket.io-client');
ioClient(url + '/?token=aaaabbbbccccdddd');

// server side
io.on('connection', function(socket) {

  const userid = socket.handshake.query.token; // aaaabbbbccccdddd
  inMemoryStore.sockets[userid] = socket.id;
    
});
B:使用非临时ID作为套接字ID

还有一个选项可以为每个套接字设置自己的自定义套接字ID。这样,您可以直接使用用户ID或任何其他非临时标识符作为套接字ID。像这样的东西:

// server side
io.engine.generateId = (req) => {
  return req.query.token;
} 

答案 1 :(得分:0)

首先,我不知道您是否刷新了套接字ID的更改页面,所以我在前端做了一个按钮,向服务器发送信号,将用户标识为admin,服务器将套接字ID保存为redis ,当任何用户加入该特定会议室时,服务器将获取该管理员ID并发送给该用户进行连接,从而允许他们共享其流。然后使用io.to(socketID).emit('user-connected',palsid);释放回仅管理员套接字。因此,连接到该会议室的任何用户都可以将流仅发送给管理员,而不是发送给会议室中的其他所有人,从而使会议成为一对多的视频会议。

我的前端代码

//for button
<Button onClick={this.setAdmin}>send stream</Button>

the function
setAdmin=()=>{
        console.log(socket.id)
            socket.emit('create-class',this.props.match.id,socket.id)
        }

我的后端代码

io.on('connection',socket =>{

socket.on('create-class',(address,socketID)=>{
  //save to redis so all client can connect to this socket
  client.set("adminsocket",socketID,(err)=>{
    if(err)throw err;
  })
  
})
socket.on('join-class',async(classId,palsid)=>{
      socket.join(classId)
//Fetch the socket.id from redis
client.get("adminsocket",(err,socketID)=>{
  if(err) throw err
    io.to(socketID).emit('user-connected', palsid);
})
   
      //on disconnection
      socket.on('disconnect',()=>{
          socket.to(classId).broadcast.emit('user-disconnect',palsid)
      })

   
  })
相关问题