【问题标题】:socket.io client to client messagingsocket.io 客户端到客户端消息传递
【发布时间】:2013-02-21 18:04:10
【问题描述】:

我无法让基本客户端到客户端(或真正的客户端->服务器->客户端)与 socket.io 一起工作。这是我现在拥有的代码:

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

users.push(socket.sessionId);

for(userID in users)    {
    console.log(userID);
    io.sockets.socket(userID).emit('message', { msg: 'New User Connected succesfully' });
}
socket.emit('message', { msg: 'Connected succesfully' });


socket.on('my other event', function (data) {
    console.log(data);
  });
});

据我了解,这应该将新用户消息发送给每个连接的用户(个人而言,因为我想稍后再做实际的个人消息)。相反,我最后只收到“连接成功”消息。我的服务器或客户端没有收到任何错误或其他负面指示。

关于为什么io.sockets.socket(userID).emit() 不起作用或用什么代替它的任何想法?

【问题讨论】:

  • 对 Socket.IO 不太熟悉,但您可能想看看 now.js 看看它是否更适合您的需求。

标签: html node.js sockets socket.io


【解决方案1】:

Socket.io 有房间的概念,一旦一个套接字加入了一个房间,它将接收发送到一个房间的所有消息,所以你不需要跟踪房间里的人,处理断开连接等。 ..

在连接时,您会使用:

socket.join('room')

并向那个房间里的每个人发送消息:

io.sockets.in('room').emit('event_name', data)

有关 socket.io wiki 的更多信息:https://github.com/LearnBoost/socket.io/wiki/Rooms

【讨论】:

  • 我想做 2 人交流(想想 gchat)。所以,我需要一种方法来通知用户 B,用户 A 希望他加入特定房间
  • 您可以为每个用户创建一个房间(基于 sessionId、电子邮件等),因此您很容易找到如何与给定用户交谈。此外,如果同一用户多次连接,向用户房间发送消息将被调度到他所有活动的浏览器。
【解决方案2】:

试试

users.push(socket); // without .sessionId

for (var u in users)    {
   // users[u] is now the socket
   console.log(users[u].id);
   users[u].emit('message', { msg: 'New User Connected succesfully' });
}

【讨论】:

  • 这行得通,但我觉得用户数组会变得很大,可以容纳所有这些套接字。有没有办法只保留一个 id,然后即时拉出套接字?
  • 如果浏览器断开连接,这将泄漏套接字,您需要捕获断开连接事件并进行清理。无论如何,Socket.io 都会保留连接的套接字,因此您不会使用更多内存。
  • @PascalBelloncle 我不是 javascript 专家,该数组是否会引用套接字而不是副本?我认为它需要 2 倍的正常内存
  • 一个 javascript 数组只保留对其对象的引用,因此这并不是通过将套接字放入数组来复制套接字。但是如果浏览器断开连接,并且你在数组中保留了一个引用,它就会泄漏,即使 socket.io 本身已经关闭了它。只有当没有任何东西引用它时,它才会被垃圾收集。
  • 在断开连接时删除引用socket.on('disconnect', function() { delete users[users.indexOf(socket)]; });
【解决方案3】:

您现在也可以使用 ...

io.to('room').emit('event_name', data);

作为 io.sockets.in 的替代品

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2020-02-01
    • 2015-02-16
    相关资源
    最近更新 更多