Socket.io - 广播在断开连接事件中不起作用

arl*_*iss 1 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
    });
});
Run Code Online (Sandbox Code Playgroud)

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

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

然而它并没有消失,我测试了它不执行客户端代码,我猜这意味着它没有到达它。

有任何想法吗?

基本上我正在构建聊天应用程序。到目前为止,它工作正常,当用户加入时,他们会被添加到用户在线列表等...但是当用户离开时 - 我无法找到方法告诉所有其他在线用户该用户已离开并将其从用户在线列表/选项卡中删除。

我正在使用以下命令创建套接字连接:

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.
Run Code Online (Sandbox Code Playgroud)

});

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

    socket.username = data;
    usersonline.push(data);
    socket.emit('loadusers', usersonline);
    socket.broadcast.emit('newuser', {
        'username' : data
    });
Run Code Online (Sandbox Code Playgroud)

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

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

});
Run Code Online (Sandbox Code Playgroud)

因此,当用户离开时,我想我可以轻松地删除该 div,并且用户将从在线用户列表中动态消失。但这行不通。需要另一种方式。

lag*_*lex 5

您的代码中存在错误:您向断开连接回调传递了不必要的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
    });
});
Run Code Online (Sandbox Code Playgroud)

事实上我socket.broadcast对不起作用的看法是错误的,它确实有效!您只需纠正上述错误即可。