2014-10-17 104 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