Socket.io: como entrar e sair corretamente dos quartos
Estou tentando aprender o Socket.io criando um conjunto de salas de bate-papo criadas dinamicamente que emitem mensagens 'conectadas' e 'desconectadas' quando os usuários entram e saem. Depois de olhar para umcasal do questões Reuni algo funcional, mas a maioria das respostas vinculadas são de pessoas que admitem ter hackeado as respostas e notei que há uma discussão mais geral - e recente - sobre a maneira correta de fazer isso no Socket.io repo (principalmenteaqui eaqui)
Como eu sou um novato, não sei se o trabalho abaixo é uma maneira aceitável de fazer as coisas ou simplesmente funciona acidentalmente, mas causará problemas de desempenho ou resultará em muitos ouvintes. Se houver uma maneira ideal - e oficial - de entrar e sair de salas que pareçam menos desajeitadas do que isso, eu adoraria aprender sobre isso.
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
});
})
});