0

我正在使用 ionic 构建移动应用程序,我正在使用 socket.io,我希望能够向具有 id 的特定用户发送消息,而不是向所有人广播消息,聊天应用程序不是聊天室风格的那种的应用程序,但像 watsapp 这样的一对一聊天应用程序,我在网上搜索但我看到的内容不起作用,这是服务器端的代码

const io = require('socket.io')(server);

io.on('connection', socket => {
        console.log('New user connected');
        socket.on('get_all_msg', data => {
            DBConn.query(`SELECT * FROM chats WHERE rec_id = ? || send_id=?`, [data.id, data.id], (error, results, fields) => {
                if (error) throw error;
                io.to(data.id).emit('all_msg', results)
            });
        })
    })

我正在聊天的用户的 id 是data.id,我尝试使用io.to(data.id).emit('all_msg', results)但用户没有收到任何消息,请问我在做什么这是不对的

这是客户端代码

this.socket.emit('get_all_msg', {id:this.contactInfo.id})
this.service.socket.fromEvent('all_msg').subscribe((data:any) => {
    console.log(data)
})

ngx-socket.io在我的离子添加中使用

4

1 回答 1

0

我们需要将套接字 id 映射到用户 id;我们可以使用 redis 解决这个问题,但我所做的简单方法是

实际上,socket io 本身将电流加入一个带有其 id(socketio) 本身的房间;我当时想,“为什么不使用 user_id 将该套接字加入房间”

后端:

io.on('connection',socket=>{
  socket.on('join-me',userid=>{
     socket.join(userid);
   })
})

前端侧:

const socket=io(`blahblah`);
socket.on('connect',()=>{
   socket.emit('join-me',current_user_id);
})

当一个用户发出新消息事件时,我们可以获得参与者的 id,并且可以简单地循环他们的 id 并发出一个事件

socket.on('message',data=>{
  //do some logic let say 
  participents=data.participents;
  parsedMessage=someLogic(data);
  for(id of participents){
    
     //here is the magic happens io.to(room_id) here room id is user id itself.
     io.to(id).emit('new-message',parsedMessage);
   }
})

适用于一对一和群聊!

于 2020-09-04T14:38:42.840 回答