socket.io 客户端到客户端消息传递

Posted

技术标签:

【中文标题】socket.io 客户端到客户端消息传递【英文标题】:socket.io client to client messaging 【发布时间】: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 看看它是否更适合您的需求。 【参考方案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 的替代品

【讨论】:

以上是关于socket.io 客户端到客户端消息传递的主要内容,如果未能解决你的问题,请参考以下文章

如何实现socket.io的生存时间

socket.io(转载)

将 socket.io 添加到现有的 Express 项目(前面有 React)

socket.io简单总结

反应的socket.io聊天问题

socket.io 中文手册 socket.io 中文文档