无法使用socket.io更新用户

时间:2017-01-31 02:00:33

标签: javascript socket.io

我试图显示所有连接的用户。第一次事件显示唯一用户连接,但如果我加载新页面 使用新的昵称,用户不会在第一个更新,第二页更新完美, 但如果我加载第三页,第三页完美更新 而其他人没有。仅加载的最终页面显示所有连接的用户。

Image of my problem

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




});

1 个答案:

答案 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');
    

这种方式将允许您通知所有关于当前用户的连接,但如果您不清除或忽略某些已经添加的用户,则大多数将在当前模式中失败。

我希望将两个事件作为“新成员”并发送整个用户数据而不是所有用户,然后“删除”以删除成员引用并避免重新打印或验证事物。

要获得更多广告用法,您需要检查命名空间。将事件发送到某些连接组。

检查出来;)

http://socket.io/docs/server-api/

相关问题