SocketIO - 如何向特定客户端发送数据

Posted

技术标签:

【中文标题】SocketIO - 如何向特定客户端发送数据【英文标题】:SocketIO - How to send data to a specific client 【发布时间】:2015-09-23 23:13:36 【问题描述】:

我在向特定客户端发送数据时遇到问题。

服务器端

var io = require('socket.io').listen(app.listen(app.get('port')));

io.sockets.on('connection', function (socket) 

    socket.on('onHabboConnection', function (data) 
      socket.id = data.id; 
      socket.join(data.id);
      io.sockets.in(data.id).emit('onHabboConnected');
    );
    
    socket.on('onHabboConnected', function (data) 
      console.log("<" + socket.id + "> " + data.username + " has joined the game.");
    );
);

客户端

	  var socket = io.connect('http://localhost:3000');
               $( document ).ready(function() 
	 	socket.emit('onHabboConnection',  id:'<%= user.id %>' );
	 );

	  socket.on('onHabboConnected', function () 
	  	console.log("WORKING" );
	  	socket.emit('onHabboConnected',  username: '<%= user.username %>');
	  );

  io.sockets.in(data.id).emit('onHabboConnected');

我尝试了所有方法,但它们都抛出错误。 这个不会抛出错误但什么都不做!

【问题讨论】:

“我尝试了所有方法,但它们都抛出错误。” 你尝试过 socket.emit 吗?如果是这样,请列出您尝试失败的所有其他“方法”及其错误,以减少猜测。 socket.emit() 适用于这种情况。抛出了什么错误? io.sockets.in(data.id).emit('onHabboConnected');没有发送给客户端。 BUMP,有人请吗? 【参考方案1】:

您正在覆盖在客户端生成的唯一标识符 socket.id。这就是你发出但它不会去任何地方的原因,因为该客户端不存在:

socket.on('onHabboConnection', function (data) 
  //socket.id = data.id;  remove this
  socket.join(data.id);
  io.sockets.in(data.id).emit('onHabboConnected');
);

如果您想更改 socket.id ,请在客户端进行更改。

【讨论】:

但是其他用户不能通过客户端更改用户ID吗? socket id 是为客户端生成的唯一会话标识符。为什么你需要改变它? 在这种情况下,从客户端更改它。但是是的,另一个用户可能能够更改它。可能您需要添加一些身份验证,如提到的here 我正在使用,socket.emit 发送到指定的传入客户端。可以吗?

以上是关于SocketIO - 如何向特定客户端发送数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥socketio广播向除了发送它的那个客户端之外的所有客户端发送?

使用 Socket IO、Laravel、Redis、Angularjs 向特定用户发送数据

在异步套接字中向特定客户端发送数据

带有广播 = true 的 Flask SocketIO Emit 不会向发送者发送消息

向所有客户端发出的 SocketIO 不起作用

向特定用户发送通知