2014-10-17 70 views
0

我写了这个代码基本上内工作: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(); 
}); 

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

任何想法?

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

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,并且用户将从在线用户列表中动态消失。但这不起作用。 需要一种替代方法。

回答

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不工作,它的工作!你只需要纠正上述错误。

+0

所以等待,你是说我应该从客户端,而不是服务器端解析断开连接的用户ID? – arleitiss 2014-10-17 11:46:31

+0

似乎也不适用于客户端断开连接事件。 我需要找到方式告诉所有用户特定的用户名已经离开聊天。 – arleitiss 2014-10-17 15:23:40

+0

@arleitiss尝试'io.emit'而不是'broadcast' – laggingreflex 2014-10-17 16:26:45