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 客户端到客户端消息传递的主要内容,如果未能解决你的问题,请参考以下文章