Socket.io: cómo unirse y salir correctamente de las habitaciones
Estoy tratando de aprender Socket.io mediante la creación de un conjunto de salas de chat creadas dinámicamente que emiten mensajes 'conectados' y 'desconectados' cuando los usuarios entran y salen. Después de mirar unPareja de preguntas He reunido algo funcional, pero la mayoría de las respuestas vinculadas provienen de personas que admiten que han pirateado las respuestas y he notado que hay una discusión más general y reciente sobre la forma correcta de hacer esto en Socket.io repo (notablementeaquí yaquí)
Como soy un novato, no sé si el trabajo a continuación es una forma aceptable de hacer cosas o si simplemente funciona de manera incidental, pero causará problemas de rendimiento o resultará en demasiados oyentes. Si hay una forma ideal, y oficial, de unirse y salir de las habitaciones que se siente menos torpe que esto, me encantaría saberlo.
Cliente
var roomId = ChatRoomData._id // comes from a factory
function init() {
// Make sure the Socket is connected
if (!Socket.socket) {
Socket.connect();
}
// Sends roomId to server
Socket.on('connect', function() {
Socket.emit('room', roomId);
});
// Remove the event listener when the controller instance is destroyed
$scope.$on('$destroy', function () {
Socket.removeListener('connect');
});
}
init();
Servidor
io.sockets.once('connection', function(socket){
socket.on('room', function(room){ // take room variable from client side
socket.join(room) // and join it
io.sockets.in(room).emit('message', { // Emits a status message to the connect room when a socket client is connected
type: 'status',
text: 'Is now connected',
created: Date.now(),
username: socket.request.user.username
});
socket.on('disconnect', function () { // Emits a status message to the connected room when a socket client is disconnected
io.sockets.in(room).emit({
type: 'status',
text: 'disconnected',
created: Date.now(),
username: socket.request.user.username
});
})
});