Socket.io Identifies user for Socket

I am writing sample code that identified users through socket.io ... So now I have to write code on the index page to communicate with users.

The code below and HOW to send a message to the user [1] "Welcome" and for the user [2] "HI men", as well as limit the connection of users fr. therefore, when 2 users are connected, then someone else cannot connect ..

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); 
+7
source share
2 answers

You can start by looking at setting up authorization using Socket.io . handshakeData provided by the callback can be changed there (i.e.: add the username property), and any changes will be available through socket.handshake in your app.js application (via the object passed to the callback for io.sockets.on('connection',.. ), Using the request header information, which is also available from the handshakeData file, you can set custom values ​​in the authorization callback (i.e.: from the database) so that you can identify the user for this socket in your application.

Here is a similar example

+7
source

I know that a lot of time has passed since you asked this, but just 4 days ago I published a module for node js, express and socket.io that controls exactly what you wanted. Check usage and example; Hope you find this module useful!

You can install it through NPM socket.io.users. This is the node js module for socket.io applications. One user per client.

Some of the usage code:

 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 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.. 
+3
source

All Articles