2013-06-11 1 views
0

J'utilise Node js et socket.io pour implémenter l'application de base de discussion. Chaque client qui écrit un message est diffusé à tous les clients connectés au serveur (c'est une application multi-navigateur). Maintenant, je veux qu'un seul client qui obtient le premier accès au serveur puisse transmettre des messages à tous alors que les autres utilisateurs abonnés peuvent UNIQUEMENT recevoir des messages (ne peuvent envoyer de données à aucun). Ma question est comment dois-je identifier le client sur le serveur quand il donne une demande pour l'envoi de données à tous?Comment identifier de manière unique un navigateur (ou un client) à chaque fois qu'il est connecté au serveur

Ceci est côté serveur implentation:

var app = require('express')() 
    , server = require('http').createServer(app) 
    , io = require('socket.io').listen(server); 
server.listen(3000); 

app.get('/', function(req, res) 
{ 
    res.sendfile(__dirname + '/index.html'); 
}); 

io.set('log level', 1); 

io.sockets.on('connection', function(socket) 
{ 
    socket.emit('news', "Hello, welcome to our conversation!<br />"); 
    socket.on('receive', function(data) 
    { 
     //log it to console 
     console.log(data.data); 
     // announce to all clients that someone sent you data. 
    socket.broadcast.emit('news', "Client says: " + data.data + "<br />"); 
    }); 
}); 

Répondre

2

Vous pouvez identifier chaque socket en utilisant son identifiant unique: socket.id Peut-être que vous pouvez faire quelque chose comme ça pour arrêter tout le monde, sauf la première prise de la radiodiffusion.

var firstClient; 

io.sockets.on('connection', function(socket) 
{ 
    if(!firstClient){ 
     firstClient = socket.id; 
    } 
    socket.emit('news', "Hello, welcome to our conversation!<br />"); 
    socket.on('receive', function(data) 
    { 
     if(socket.id!==firstClient){ 
     return; // not the first client, so not allowed to broadcast. 
     } 

     //log it to console 
     console.log(data.data); 
     // announce to all clients that someone sent you data. 
     socket.broadcast.emit('news', "Client says: " + data.data + "<br />"); 
    }); 
}); 
+0

Cet "identifiant" est-il attribué de manière séquentielle? –

+0

non, car cela crée une faille de sécurité où les utilisateurs peuvent deviner l'ID de socket de quelqu'un d'autre. C'est un nombre aléatoire sécurisé. Voir ici pour plus d'informations: https://github.com/LearnBoost/socket.io/issues/856 – AndyD

+0

ooooh bien merci beaucoup –

Questions connexes