在Socket.IO 1.0中将消息发送到特定ID

81 socket.io socket.io-1.0

我想将数据发送到一个特定的套接字ID.

我们以前能够在旧版本中执行此操作:

io.sockets.socket(socketid).emit('message', 'for your eyes only');
Run Code Online (Sandbox Code Playgroud)

我如何在Socket.IO 1.0中做类似的事情?

小智 200

在socket.io 1.0中,它们为此提供了更好的方法.每个套接字通过自身ID自动加入默认房间.检查文件:http://socket.io/docs/rooms-and-namespaces/#default-room

因此,您可以使用以下代码通过id发出一个套接字:

io.to(socketid).emit('message', 'for your eyes only');
Run Code Online (Sandbox Code Playgroud)

  • 我们如何通过他们的socketId识别特定用户,这是否意味着我们需要在某处存储键值对用户(例如用户名)和socketId? (7认同)
  • 大!谢谢你的解决方案 (4认同)

Ole*_*leg 93

在socket.io 1.0中,您可以使用以下代码执行此操作:

if (io.sockets.connected[socketid]) {
    io.sockets.connected[socketid].emit('message', 'for your eyes only');
}
Run Code Online (Sandbox Code Playgroud)

更新:

@MustafaDokumacı的答案包含更好的解决方案.

  • + 1表示确认并指向相对较好的答案 (24认同)
  • 这个答案与更好的答案之间的区别在于,使用此解决方案,您可以进行回调,这很好.但是使用io.to(socketid),你不能使用回调. (3认同)

Dhi*_*dya 16

@MustafaDokumacı和@Curious已经提供了足够的信息,我正在添加如何获得套接字ID.

要获取套接字ID,请使用socket.id:

var chat = io.of("/socket").on('connection',onSocketConnected);

function onSocketConnected(socket){
   console.log("connected :"+socket.id);  
}
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您使用了命名空间,我发现以下工作:

//Defining the namespace <br>
var nsp = io.of('/my-namespace');

//targeting the message to socket id <br>
nsp.to(socket id of the intended recipient).emit('private message', 'hello');
Run Code Online (Sandbox Code Playgroud)

有关命名空间的更多信息:http: //socket.io/docs/rooms-and-namespaces/


小智 5

我相信@Curious和@MustafaDokumacı都提供了运行良好的解决方案.不同之处在于,使用@MustafaDokumacı的解决方案,消息被广播到一个房间而不仅仅是特定的客户端.

请求确认时,差异很明显.

io.sockets.connected[socketid].emit('message', 'for your eyes only', function(data) {...});
Run Code Online (Sandbox Code Playgroud)

按预期工作,而

io.to(socketid).emit('message', 'for your eyes only', function(data) {...});
Run Code Online (Sandbox Code Playgroud)

失败了

Error: Callbacks are not supported when broadcasting
Run Code Online (Sandbox Code Playgroud)