2012-05-20 12 views
7

Scrivo alcuni esempi di codice che identificano gli utenti connessi tramite socket.io ... Quindi ora devo scrivere un codice nella pagina indice per comunicare con gli utenti.Socket.io Identify User for Socket

Il codice è sotto e COME inviare un messaggio all'utente [1] "Benvenuto" e per l'utente [2] "Uomini HI" e limitare anche la connessione di 2 utenti. così quando 2 utente connesso quindi chiunque altro cant connettersi ..

Index.HTML:

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect(); 
    var users; 
    socket.on('hello', function (data) { 
    console.log(data.hello); 
    }); 
    socket.on('listing', function (data) { 
    users = data; 
    }); 
    socket.on('chat', function (message) { 
    console.log(message); 
    }); 
    socket.on('message', function (message) { 
    console.log(message); 
    }); 
    function chat (message) { 
    socket.emit('chat', message); 
    } 
    function message (user, message) { 
    socket.emit('message', { 
     user: user, 
     message: message 
    }); 
    } 
</script> 

app.js

var express = require('express'); 
var app = express.createServer(); 
var io = require('socket.io').listen(app); 

app.listen(3000); 

app.use(express.static(__dirname)); 

var users = {}; 
var userNumber = 1; 

function getUsers() { 
    var userNames = []; 
    for(var name in users) { 
    if(users[name]) { 
     userNames.push(name); 
    } 
    } 
    return userNames; 
} 

io.sockets.on('connection', function (socket) { 
    var myNumber = userNumber++; 
    var myName = 'user#' + myNumber; 
    users[myName] = socket; 

    socket.emit('hello', { hello: myName }); 
    io.sockets.emit('listing', getUsers()); 

    socket.on('chat', function (message) { 
    io.sockets.emit('chat', myName + ': ' + message); 
    }); 
    socket.on('message', function (data) { 
    users[data.user].emit('message', myName + '-> ' + data.message); 
    }); 

    socket.on('disconnect', function() { 
    users[myName] = null; 
    io.sockets.emit('listing', getUsers()); 
    }); 
}); 

app.listen(process.env.PORT); 
+0

così si vuole identificare quale utente è collegato a quale presa? – Dhiraj

+0

avere variabili come userNumber va bene, ma sicuramente non ti aiuterà a lungo termine, suggerisco di andare su mongodb e iniziare a memorizzare valori in esso – Dhiraj

+0

Ho bisogno di questo per un esempio ... quindi voglio capire come inviare un messaggio diverso per utente diverso e inviare un messaggio dal client al server e quindi lavorare con i messaggi ... quindi ho bisogno, ad esempio, di inviare un messaggio onload all'utente [1] e poi quando il messaggio è stato inviato per creare un div che vorrà 5s - solo per l'utente 1 ... non per l'utente 2 ... e anche come inviare un messaggio per entrambi gli utenti – beginerplus

risposta

7

Si può iniziare da dare un'occhiata a come configure authorization with Socket.io. Il handshakeData fornito dal callback può essere modificato lì (es .: aggiungi una proprietà username), e tutte le modifiche saranno accessibili tramite socket.handshake nel tuo app.js (tramite l'oggetto passato alla callback per io.sockets.on('connection',..). Utilizzando le informazioni dell'intestazione della richiesta accessibile anche da handshakeData, è possibile impostare i valori utente all'interno della richiamata di autorizzazione (ovvero da un database) in modo da poter identificare l'utente per il socket specificato nell'app.js.

Here's a similar example

+0

c'è un esempio con mongodb – beginerplus

+0

Questo esempio non è specifico di alcun database, non c'è alcun codice dB in quella risposta. Dirigetevi su mongoosejs.com per imparare MongoDB per Node. –

+0

Se cerchi MongoDB per Nodejs, prendi semplicemente lib ufficiale. Ho esperienza con entrambi e ufficiale è meglio di mangusta in applicazioni più grandi. Con la mangusta devi imparare come mongoose riassume mongo e non è sempre una cosa buona da avere. http://mongodb.github.io/node-mongodb-native/2.2/api/ –

3

So che è stato molto tempo da quando hai chiesto questo, ma solo 4 giorni fa ho pubblicato un modulo per js nodo, esprimere e socket.io che gestisce che esattamente cosa si voleva. Controlla l'utilizzo e l'esempio; Spero che troverai questo modulo utile!

È possibile installarlo tramite NPM socket.io.users This is a node js module for socket.io applications. One user per client.

Parte del codice di utilizzo:

var express = require('express'); 
var app = express(); 
var server = require('http').createServer(app); 
var socketUsers = require('socket.io.users'); 

// ... 
socketUsers.Session(app); // IMPORTANT ! 
// ... 

var rootIo = require('socket.io')(server); // default '/' as namespace. 
var chatIo = rootIo.of('/chat'); 

var rootUsers = socketUsers.Users; /* default '/' as namespace. 
Each namespace has ITS OWN users object list, 
but the Id of a user of any other namespace may 
have the same value if request comes from the same client-machine-user. 
This makes easy to keep a kind of 
synchronization between all users of all the different namespaces. */ 

var chatUsers = socketUsers.Users.of('/chat'); // 

rootIo.use(socketUsers.Middleware()); 
/* IMPORTANT but no errors if you want 
to skip it for a io.of(namespace) 
that you don't want the socket.io.users' support. */ 

chatUsers.use(socketUsers.Middleware()); 

chatUsers.on('connected',function(user){ 
console.log(user.id + ' has connected to the CHAT'); 
user.store.username = 'username setted by server side'; /*at the store 
property you can store any type of properties 
and objects you want to share between your user's sockets. */ 
user.socket.on('any event', function(data){ 
/*user.socket is the current socket, to get all connected sockets from this 
user, use: user.sockets */ 

}); 
chatIo.emit('set username',user.store.username); 
}); 

rootUsers.on('connected',function(user){ 
    console.log('User has connected with ID: '+ user.id); 
}); 



rootUsers.on('connection',function(user){ 
    console.log('Socket ID: '+user.socket.id+' is user with ID: '+user.id); 
}); 

rootUsers.on('disconnected',function(user){ 
    console.log('User with ID: '+user.id+'is gone away :('); 
}); 

//...server.listen blabla..