我试图显示所有连接的用户。第一次事件显示唯一用户连接,但如果我加载新页面 使用新的昵称,用户不会在第一个更新,第二页更新完美, 但如果我加载第三页,第三页完美更新 而其他人没有。仅加载的最终页面显示所有连接的用户。
SERVER
var app = require('express')();
var express = require('express');
var http = require('http').Server(app);
var io = require('socket.io')(http);
var nicks = new Array();
app.use(express.static('./public'));
io.sockets.on('connection', function(socket) {
socket.on('nick', function(data) {
var nick = data.nick;
nicks.push(nick);
socket.emit('users', {
nicks: nicks
});
})
});
app.get('/', function(req, res) {
res.sendFile(__dirname + '/index.html');
});
http.listen(3000, function() {
console.log('listening on *:3000');
});
客户端
$(document).ready(function() {
var socket = io();
var nickname;
var nicks = new Array();
nickname = prompt('Write your name:');
$("#button").on("click", function(event) {
var nick = nickname;
socket.emit('nick', {
nick: nick
});
});
socket.on('users', function(data) {
nicks = data.nicks;
for (var i = 0; i < nicks.length; i++) {
$("#users_connected").append('<li>' + nicks[i] + '</li>');
}
});
});
答案 0 :(得分:3)
问题是你正在使用socket.emit()
来自docs:
意味着唯一获得users
事件的人与发送昵称事件相同。
Yoy必须要使用Server.emit()
来自docs:
向所有连接的客户端发送事件。以下两个是
var io = require('socket.io')();
io.sockets.emit('an event sent to all connected clients');
io.emit('an event sent to all connected clients');
这种方式将允许您通知所有关于当前用户的连接,但如果您不清除或忽略某些已经添加的用户,则大多数将在当前模式中失败。
我希望将两个事件作为“新成员”并发送整个用户数据而不是所有用户,然后“删除”以删除成员引用并避免重新打印或验证事物。
要获得更多广告用法,您需要检查命名空间。将事件发送到某些连接组。
检查出来;)