【问题标题】:Sending pm with Socket.IO使用 Socket.IO 发送 pm
【发布时间】:2013-08-14 22:57:12
【问题描述】:

我已经实现了 Node.js 服务器端和 ios 客户端来发送 pm 消息。但主要问题是,我的代码仍然像文本消息一样为所有客户端广播。 (我在 3 部手机上试过,我只是向特定的客户发送电子邮件,但客户和我发送该消息的手机都没有消息)

我的服务器代码如下所示:

io.sockets.on('connection', function (socket) {
  var userName;
  var userSrcID;

  socket.on('setUserName',function(user){
    userName = user.name;
    userSrcID = user.id;
    clients[user.name] = socket;
    clients[user.id] = socket;
    console.log('data = ',user);
    //io.sockets.emit('new user', user.name + " has joined.");
  });

  socket.on('message', function(msg){
    io.sockets.emit('message', msg);
  });

  socket.on('pm', function(msg){
    fromMsg = {from:userSrcID, txt:msg}
    //clients[msg.to].emit('private message', fromMsg);
    console.log('Gidicek username:',userName);
    io.sockets.emit('new message',{msg: msg,destID:userSrcID}); 

我可以建立一个条件,如果该消息的目标用户 ID 不属于我的用户 ID,请不要显示,但它更像是使用 Old-School HUB 网络而不是 switch :)

任何帮助将不胜感激

最好的问候,

【问题讨论】:

  • 如果你想发送给特定的用户,你只需要发送到那个用户的套接字。见:Send message to specific client with socket.io and node.js中的第二个答案
  • 我将客户端推送到节点的用户标识作为目标标识,即 = clients[user.id] = socket;那么如何使用该声明发送该用户?
  • clients[userDestId].emit(…)

标签: node.js socket.io


【解决方案1】:

您可以将消息作为对象发送,因此您可以在其中包含接收者用户 ID。有了它,您就可以检索接收器套接字,然后向该特定用户发出消息。

它看起来像这样。

// assuming msg object would look something like this
// msg = { text: 'message text', receiverID: 123 };  

socket.on('pm', function(msg){
    var userSocket = clients[msg.receiverID];
    userSocket.emit('new message',{msg: msg.text, destID:userSrcID}); 
});

【讨论】:

    【解决方案2】:

    不要使用io.sockets.emit,而是使用您存储在客户端数组中的套接字。

    当您想发送给特定用户时,您应该将用户名或 -id 与消息一起传递,如下所示:

    socket.on('pm', function(message) {
        var to = msg.toUserId;
        var msg = message.message;
        clients[to].emit(msg);
    }
    

    从客户端内部:

    socket.emit('pm', {'toUserId': userid, 'message': 'hello over there'});
    

    【讨论】:

    • 你的意思是使用 io.socket.socket 而不是 io.sockets.emit('message', msg); ?
    • socket.emitio.sockets.emit 之间存在差异。 io.sockets.emit 向所有连接的客户端(包括发送者)发送消息,而socket.emit 仅向该特定套接字发送消息。
    • 谢谢你的帮助,我不知道socket.emit和io.sockets.emit的区别。现在一切都清楚了:)
    • 如果答案对您有价值,请评分。
    • 我需要 25 名声望而不是评价答案:( 这就是为什么我不能评价任何问题:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2017-12-18
    • 2019-09-12
    相关资源
    最近更新 更多