socket.io客户端之间的消息传递

4

我在使用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,看它是否更适合你的需求。 - Andrew Mao
3个回答

5

Socket.io有房间的概念,一旦一个socket加入了一个房间,它将接收到发送到该房间的所有消息,因此您不需要跟踪谁在房间中,处理断开连接等问题...

在连接时,您可以使用:

socket.join('room')

向该房间中的所有人发送消息:

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

更多有关socket.io的信息,请参考其wiki:https://github.com/LearnBoost/socket.io/wiki/Rooms


我想要进行两个人之间的通讯(类似于Gchat)。因此,我需要一种方式向用户B发送消息,告知用户A想要邀请他加入特定房间。 - MrGlass
1
您可以根据sessionId、电子邮件等为每个用户创建一个房间,这样你就可以轻松地找到如何与给定的用户交谈。此外,如果同一用户多次连接,向用户房间发送消息将分发到他所有活跃的浏览器。 - Pascal Belloncle

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,然后在需要时再获取套接字? - MrGlass
如果浏览器断开连接,这将导致套接字泄漏,您需要捕获断开连接事件并清除。 Socket.io仍然保留连接的套接字,因此您不会使用更多内存。 - Pascal Belloncle
@PascalBelloncle 我不是 JavaScript 专家,那个数组会有 socket 的引用而不是副本吗?我觉得这会占用正常内存的两倍。 - MrGlass
1
一个 JavaScript 数组只保留对其对象的引用,所以将其放入数组中并不会复制 socket。但是,如果浏览器断开连接,并且您在数组中保留了引用,即使 socket.io 自身已经关闭它,它仍然会泄漏。只有当没有任何引用指向它时,它才会被垃圾回收。 - Pascal Belloncle
移除断开连接时的引用 socket.on('disconnect', function() { delete users[users.indexOf(socket)]; }); - mak

1
你现在也可以使用...
io.to('room').emit('event_name', data);

作为 io.sockets.in 的替代方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接