【问题标题】:Socket.io - Broadcast doesn't work within disconnect eventSocket.io - 广播在断开事件中不起作用
【发布时间】:2014-10-18 01:29:05
【问题描述】:

这段代码基本上是我写的:

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();
});

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

有什么想法吗?

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

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

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.

});

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

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

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

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

});

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

【问题讨论】:

    标签: node.js express socket.io


    【解决方案1】:

    您的代码中有一个错误:您正在向断开回调传递一个不必要的 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 不工作,它确实有效!您只需要更正上述错误。

    【讨论】:

    • 等等,你是说我应该从客户端而不是服务器端解析断开连接的用户 ID?
    • 似乎也不适用于客户端断开事件。我需要想办法告诉所有用户特定用户名已离开聊天。
    • @arleitiss 尝试使用io.emit 而不是broadcast
    • 那也没用。任何替代方案/解决方法可以让我告诉所有连接的用户哪个用户离开了?
    • @arleitiss 只是为了更好地了解您在做什么,您有 2 个客户,当其中一个断开连接时,您想告诉另一个,对吗?你是如何打开这两个客户的?对于您的问题,see this
    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2017-04-28
    • 2021-06-07
    • 2017-11-01
    • 1970-01-01
    • 2016-12-19
    • 2018-11-26
    相关资源
    最近更新 更多