2017-01-31 5 views
2

Im пытается показать всех подключенных пользователей. Впервые событие показывает единственного подключенного пользователя, но если я загружу новую страницу с новым псевдонимом, пользователи не будут обновляться в первом, а второе обновление страницы отлично, , но если я загружу третью страницу, третья страница прекрасно обновляет , а другие нет. Только конечная загруженная страница показывает всех подключенных пользователей.Невозможно обновить пользователей, используя 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>'); 
     } 
    }); 




}); 

ответ

3

Проблема заключается в том, что ваш используете socket.emit() из документации:

  • Выдает событие в сокет, идентифицированное именем строки.

Значение означает, что только событие users совпадает с событием ник.

Yoy должны хотеть использовать Server.emit() Из документации:

  • Издает событие для всех подключенных клиентов. Следующие два являются

    var io = require('socket.io')(); 
        io.sockets.emit('an event sent to all connected clients'); 
        io.emit('an event sent to all connected clients'); 
    

Таким образом, позволит Вам сообщить все conections о текущих пользователях, но в основном потерпит неудачу в вашей текущей схеме, если вы не ясно, или игнорировать то уже добавленные пользователь.

Я бы предпочел, чтобы два события были «новым членом» и отправили целые пользовательские данные не всем пользователям, а затем «disconected», чтобы удалить ссылку на Member и избежать повторной печати или проверки.

Для более удобного использования вам необходимо проверить пространства имен. Чтобы отправлять события определенным группам соединений.

Проверьте это;)

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

+0

работы !!!, я принимаю ваш ответ, спасибо так много братан !!! я очень ценю вашу помощь :) –