发送私人消息(Socket.IO)

发送私人消息(Socket.IO),socket.io,Socket.io,在许多帖子或文章中,我经常看到类似的事情 Client-Side : socket.emit("shhh!Secrets", { To : "AlexId", Message : "Hello World!" }) 无论是socketId,特定用户socketObj或room基地 如果我更改客户端源代码并与其他人一起更改room或socketId,那么我的疯狂消息将保存到其他人的聊天时间线…第一种方法 Socket.IO是有状态的。因此,此智能插座不会在每次事件呼叫中忘记您是谁

在许多帖子或文章中,我经常看到类似的事情

Client-Side :

 socket.emit("shhh!Secrets", {
  To : "AlexId",
  Message : "Hello World!"
 })
无论是
socketId
,特定用户
socketObj
room
基地


如果我更改客户端源代码并与其他人一起更改
room
socketId
,那么我的疯狂消息将保存到其他人的聊天时间线…

第一种方法

Socket.IO是有状态的。因此,此智能插座不会在每次事件呼叫中忘记您是谁

假设用户想要加入room001
因此,在将套接字连接到特定房间时,请将
RoomId
保存到
socket.RoomId=“room001”

然后使用io.in(socket.roomId).emit(“SO…Secrets”,“message”)

第二种方法

切勿让客户直接将信息发送到特定房间进行更改。

Server-Side: 
  
 socket.on("shhh!Secrets", (Send) => {
  // Send message only if the user already joined to this Room
  if (Send instanceof Object && socket.rooms[Send.TO] === Send.TO) 
    io.in(Send.TO).emit("SO...Secrets", Send.Message);
 })

Mohammed,当然你可以修改你的客户端代码,但是你需要知道真实的用户ID(在你的例子中是AlexId),它通常是uuid,这不容易得到。。。所以这样做的机会很小


顺便说一句,通常在文章中使用非常简单的示例,并且不提及安全方面,因此请小心使用

我对房间使用mongo dB default\u id。所以,如果我增加最后一个数字。这将是其他聊天室。正如我前面所说,这是潜在的漏洞。您需要检查用户的访问权限和写入空间。。。
Server-Side: 
  
 socket.on("shhh!Secrets", (Send) => {
  // Send message only if the user already joined to this Room
  if (Send instanceof Object && socket.rooms[Send.TO] === Send.TO) 
    io.in(Send.TO).emit("SO...Secrets", Send.Message);
 })