到目前为止,我一直在使用socketio对在线和离线功能进行一些测试,但我偶然发现了一个非常奇怪的错误。错误是
用户A(浏览器A)和用户B(浏览器B)
当用户A打开浏览器时,他将通过socketio连接,用户B也是如此。
如何使两者在线,其中一个在线,另一个不在线
我使用passport.socketio
模块获得 socket.request ,因此每个登录的用户都将通过此库连接
这是代码 的了Serverside
io.on('connection', function(socket) {
// This happen whenever user is online.
User.findById({ _id: socket.request.user._id}, function(err, foundUser) {
if (err) console.log(err);
foundUser.socketId = socket.id;
foundUser.online = true;
foundUser.save(function(err) {
if (err) console.log(err);
socket.broadcast.emit('connection', 'Online');
});
});
socket.on('disconnect', function() {
User.findById({ _id: socket.request.user._id}, function(err, foundUser) {
if (err) console.log(err);
foundUser.online = false;
foundUser.save(function(err) {
if (err) console.log(err);
socket.broadcast.emit('connection', 'Offline');
});
});
});
});
ClientSide socket.js
socket.on('connection', function(data) {
$('#online').html(data);
});
socket.on('disconnect', function() {
$('#online').html("Offline");
});
ClientSide test.html
<button type="button" id="online" class="btn btn-default"></button>
如何同时在线或离线显示它们?
每当用户A&#39;刷新 - &gt;用户B的页面显示用户A在线
,而
在用户A的页面上,用户B不在线,反之亦然
虽然它们都是通过套接字连接的。
答案 0 :(得分:1)
在我看来,你错过了两件事。
1)初始状态/在线用户列表,在启动时发送给您的客户。
2)当有在线/离线事件时,将在线/离线的用户发送给所有客户,因此clientA通知clientB上线。
编辑:请求的代码...至少有一些伪代码:
PS:我认为&#34;广播&#34;发送给所有客户。
function onlineUsers() {
var _users;
User.findAllBy({online:true}, function(err, users){
_users = JSON.stringify(users);
});
return _users;
}
io.on('connection', function(socket) {
// Let clients know currently online on startup.
socket.emit("receiveOnlineList", onlineUsers());
// .... your stuff too, but...
// notice the extra "foundUser" as param, to know who went online.
// do the same for disconnect.
socket.broadcast.emit('connection', 'Online', foundUser);
});
请注意,我的代码很可能无法正常工作,因为我不知道IO,也不知道您使用的库是否存在。