socket.io
Gestire gli utenti con socket.io
Ricerca…
introduzione
Gestire gli utenti all'interno di socket.io è semplice o complesso come deciso, anche se ci sono alcuni approcci più "ovvi" per fare ciò, questa documentazione descriverà un approccio usando map()
.
Esempio Codice lato server per la gestione degli utenti
Innanzitutto è importante notare che quando viene creato un nuovo socket viene assegnato un ID univoco che viene richiamato chiamando socket.id
. Questo id
può quindi essere memorizzato all'interno di un oggetto user
e possiamo assegnare un identificatore come un nome utente che è stato utilizzato in questo esempio per recuperare oggetti user
.
/**
* Created by Liam Read on 27/04/2017.
*/
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
function User(socketId) {
this.id = socketId;
this.status = "online";
this.username = "bob";
this.getId = function () {
return this.id;
};
this.getName = function () {
return this.username;
};
this.getStatus = function () {
return this.status;
};
this.setStatus = function (newStatus) {
this.status = newStatus;
}
}
var userMap = new Map();
/**
* Once a connection has been opened this will be called.
*/
io.on('connection', function (socket) {
var user;
/**
* When a user has entered there username and password we create a new entry within the userMap.
*/
socket.on('registerUser', function (data) {
userMap.set(data.name, new User(socket.id));
//Lets make the user object available to all other methods to make our code DRY.
user = userMap.get(data.name);
});
socket.on('loginUser', function (data) {
if (userMap.has(data.name)) {
//user has been found
user = userMap.get(data.name);
} else {
//Let the client know that no account was found when attempting to sign in.
socket.emit('noAccountFound', {
msg: "No account was found"
});
}
});
socket.on('disconnect', function () {
//Let's set this users status to offline.
user.setStatus("offline");
});
/**
* Dummy server event that represents a client looking to send a message to another user.
*/
socket.on('sendAnotherUserAMessage', function (data) {
//Make note here that by checking to see if the user exists within the map we can be sure that when
// retrieving the value after && that we won't have any unexpected errors.
if (userMap.has(data.name) && userMap.get(data.name).getStatus() !== "offline") {
var OtherUser = userMap.get(data.name);
} else {
//We use a return here so further code isn't executed, you could replace this with some for of
//error handling or a different event back to the user.
return;
}
//Lets send our message to the user.
io.to(OtherUser.getId()).emit('recMessage', {
msg: "Nice code!"
})
});
});
Questo non è affatto un esempio completo anche di ciò che è vicino a ciò che è possibile, ma dovrebbe fornire una comprensione di base di un approccio alla gestione degli users
.
Modo semplice per emettere messaggi per ID utente
Sul server:
var express = require('express');
var socketio = require('socket.io');
var app = express();
var server = http.createServer(app);
var io = socketio(server);
io.on('connect', function (socket) {
socket.on('userConnected', socket.join);
socket.on('userDisconnected', socket.leave);
});
function message (userId, event, data) {
io.sockets.to(userId).emit(event, data);
}
Sul client:
var socket = io('http://localhost:9000'); // Server endpoint
socket.on('connect', connectUser);
socket.on('message', function (data) {
console.log(data);
});
function connectUser () { // Called whenever a user signs in
var userId = ... // Retrieve userId
if (!userId) return;
socket.emit('userConnected', userId);
}
function disconnectUser () { // Called whenever a user signs out
var userId = ... // Retrieve userId
if (!userId) return;
socket.emit('userDisconnected', userId);
}
Questo metodo consente di inviare messaggi a utenti specifici per ID univoco senza tenere un riferimento a tutti i socket sul server.
Gestire gli utenti che accedono alle modali
Questo esempio mostra come gestire gli utenti che interagiscono con le modali su base 1-1.
//client side
function modals(socket) {
this.sendModalOpen = (modalIdentifier) => {
socket.emit('openedModal', {
modal: modalIdentifier
});
};
this.closeModal = () => {
socket.emit('closedModal', {
modal: modalIdentifier
});
};
}
socket.on('recModalInfo', (data) => {
for (let x = 0; x < data.info.length; x++) {
console.log(data.info[x][0] + " has open " + data.info[x][1]);
}
});
//server side
let modal = new Map();
io.on('connection', (socket) => {
//Here we are sending any new connections a list of all current modals being viewed with Identifiers.
//You could send all of the items inside the map() using map.entries
let currentInfo = [];
modal.forEach((value, key) => {
currentInfo.push([key, value]);
});
socket.emit('recModalInfo', {
info: currentInfo
});
socket.on('openedModal', (data) => {
modal.set(socket.id, data.modalIdentifier);
});
socket.on('closedModal', (data) => {
modal.delete(socket.id);
});
});
Gestendo tutte le interazioni modali qui tutti gli utenti appena connessi avranno tutte le informazioni su quali sono attualmente visualizzati, permettendoci di prendere decisioni basate sugli utenti attuali all'interno del nostro sistema.