Socket.io - 广播在disconnect事件中不起作用

时间:2014-10-17 02:56:16

标签: node.js express socket.io

我基本上写了这段代码:

socket.on('disconnect', function (socket) {
    var remove_id = usersonline.indexOf(socket.user);
    usersonline.splice(remove_id, 1);
    socket.broadcast.emit('usergone', {
        'left_user' : socket.username
    });
});

该服务器端, 这是客户方:

socket.on('usergone', function(data){
    var old_user = data['left_user'];
    console.log(old_user);
    $(old_user).remove();
});

然而,它没有关闭,我测试它没有执行客户端代码,我猜这意味着它没有达到它。

有什么想法吗?

基本上我正在构建聊天应用程序。 到目前为止,它工作正常,因为用户加入他们被添加到用户在线列表等...但当用户离开时 - 我找不到方法告诉用户已离开的所有其他在线用户并从用户在线列表/标签中删除他。< / p>

我正在使用以下内容创建套接字连接:

var http = require('http'),

    express = require('express'),

    app = express(),

    jade = require('jade'),

    io = require('socket.io'),

    server = http.createServer(app);



io = io.listen(server);


server.listen(3000);



app.set('views', __dirname + '/views');

app.set('view engine', 'jade');

app.set("view options", { layout: false });

app.use(express.static(__dirname + '/public'));

app.get('/', function(req, res){

    res.render('home.jade');

});


var usersonline = [];

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

functions here.

});

用户连接时: 他们的用户名被添加到usersonline,然后它广播到我的script.js(客户端)。它解析了usersonline数组,并为刚加入的客户端加载聊天室中的用户列表。 它还发送刚刚加入的用户用户名并告诉其他人他现在在那里,并且他被添加到在线用户列表中。

    socket.username = data;
    usersonline.push(data);
    socket.emit('loadusers', usersonline);
    socket.broadcast.emit('newuser', {
        'username' : data
    });

一切正常。除非我无法想出在用户离开时通知所有其他用户的方法。 我以为我可以轻松地: 断开连接 - 向[用户名]离开的所有其他人广播。 我的用户在线列表的工作原理是附加当前列表并添加新用户。

socket.on('newuser', function(data){
$('#chatUsers').append('<div class="user" id="'+data['username']+'">'+data['username']+'</div');

});

因此,当用户离开时,我认为我可以轻松删除该div,用户将动态地从在线用户列表中消失。但这并不奏效。 需要一种替代方式。

1 个答案:

答案 0 :(得分:3)

您的代码中存在错误:您正在将断开连接回调传递给不必要的socket参数

socket.on('disconnect', function (/* socket <- remove this */) {
    var remove_id = usersonline.indexOf(socket.user);
    usersonline.splice(remove_id, 1);
    socket.broadcast.emit('usergone', {
        'left_user' : socket.username
    });
});

实际上我错了socket.broadcast没有工作,它确实有效!您只需要纠正上述错误。