断开连接后更新客户端的用户列表

美好的一天家伙。 在这里解决我的问题。 我成功地添加了user在我的arraysusers[]在socket.io中显示连接的users在客户端。

当用户断开连接时,用户名将被删除,使用此代码delete users[socket.user]; 但是用户的名字仍然在客户端。

你能帮我取消用户名吗? 谢谢。

这是我的server.js

 var redis = require('redis'); var express = require('express'); var app = express(); var http = require('http'); var server = http.createServer(app); var io = require('socket.io').listen(server); server.listen(8080); var users = []; app.get('/', function (req, res) { res.sendfile(__dirname + '/test.html'); }); io.sockets.on('connection', function (socket) { socket.on('adduser', function (user) { socket.user = user; users.push(user); updateClients(); }); socket.on('disconnect', function () { delete users[socket.user]; updateClients(); }); function updateClients() { io.sockets.emit('update', users); } }); 

这是我的client.html

 <script src="/socket.io/socket.io.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> <script> var socket = io.connect('http://localhost:8080'); var userList = []; socket.on('connect', function (){ socket.emit('adduser', prompt("What's your name?")); }); socket.on('update', function (users){ userList = users; $('#user').empty(); for(var i=0; i<userList.length; i++) { $('#user').append("<b>" + userList[i] + "</b></br>"); } }); </script> <div style="float:left;width:100px;border-right:1px solid black;height:300px;padding:10px;overflow:scroll-y;"> <b>Users</b> <div id="users"> <p id="user"></p> </div> </div> 

我不知道该怎么把socket.on('disconnect', function() {}); 所以断开连接的用户和用户名将在客户端被删除。

客户端没有正确更新客户端的原因是因为您没有删除正确的服务器端。 您不能通过删除内容来delete数组键。 相反,这样做:

 socket.on('disconnect', function() { users.splice(users.indexOf(socket.user), 1); updateClients(); }); 

你在做什么的问题是你有效地做到这一点:

 var users = []; users.push('foo'); delete users['foo']; 

由于arr是一个数组, users['foo']将映射到未定义的。 stringfoo实际上是索引数组中的一个,所以你必须使用delete users[0] ,这将导致数组键仍然存在,但未定义:

 users[0] // undefined 

相反,你应该完全删除密钥:

 var index = users.indexOf(socket.user); users.splice(index, 1); 

您无法按内容访问数组项目。 编写一个函数遍历users数组以将其删除。

 function removeUser(username){ var users2 = []; users.forEach(function(user){ if(user === username){ return;} // do nothing this iteration users2.push(user); // if we haven't returned yet, add to users2 }); users = users2; return users2; }; socket.on('disconnect', function() { removeUser(socket.user); updateClients(); });