Como reconectar após ligar para .disconnect ()
Questão Como você reconecta um cliente ao servidor depois de emitir um manual.disconnect()
?
No meu projeto atual, preciso desconectar um cliente do servidor quando o usuário sair da sessão. Eu fiz umsocket.disconnect()
para fazer a desconexão com sucesso. O servidor removeu o usuário da sessão.
Depois de algum tempo, o usuário decidiu fazer login novamente, mas o socket.io se recusa a se conecta
Estou claro que o Socket.IO implementou o algoritmo de reconexão, mas claramente esse é um caso diferent
Abaixo é o pedaço de código onde eu faço a conexão. No segundo gatilho desse bloco de código, o objetosocket
foi criado, mas nãoconnect
foi disparado deste objeto.
//Start the socket
var socket = io.connect(SOCKET_IO_URL);
socket.on('connect', function() {
me.fireEvent('connect');
socket.emit('register', {
hashed_identifier: hashed_identifier,
account_id: account_id
});
});
socket.on('ready', function() {
me.ready = true;
me.log('Handshake done. Listening for new data');
});
socket.on('data', function(data) {
me.fireEvent('data', data);
//Tells server we received it
socket.emit('data', {ack: 1});
});
socket.on('disconnect', function() {
me.fireEvent('disconnect');
});
UPDATE: Conforme solicitado por @ Tony
Na verdade, tudo está incluído no Sencha Touch 2.0, mas acredito que não há nada a ver com o ST2.0
Esta é a minha classe de dados. O uso dessa classe é que, quando o usuário efetuou login, essa classe será inicializada. E após o logout do usuário, o sistema chamará odisconnect()
método nesta classe.
Quando o usuário faz login novamente, essa classe é inicializada novamente, mas engraçado é que o soquete de alguma forma retinha todos os eventos e sessões anteriores que tinha anteriorment
/**
* Serve as interface to wait for data communication in between server and client
*/
Ext.define('go.module.connect.Data', {
mixins: {
observable: 'Ext.mixin.Observable'
},
config: {
account: null
},
ready: false,
socket: null,
constructor: function(cfg) {
var me = this,
hashed_identifier = Sha1.hash(go.__identifier);
me.initConfig(cfg);
var account_id = me.getAccount().get('id');
//Start the socket
var socket = io.connect(SOCKET_IO_URL);
socket.on('connect', function() {
console.log('connect');
me.fireEvent('connect');
socket.emit('register', {
hashed_identifier:hashed_identifier,
account_id: account_id
});
});
socket.on('ready', function() {
me.ready = true;
me.log('Handshake done. Listening for new data');
});
socket.on('data', function(data) {
me.fireEvent('data', data);
//Tells server we received it
socket.emit('data', {ack: 1});
});
socket.on('disconnect', function() {
me.fireEvent('disconnect');
});
console.log(socket);
if (!socket.socket.connected){
socket.socket.reconnect();
}
me.socket = socket;
me.callParent([cfg]);
},
disconnect: function() {
this.socket.disconnect();
this.socket.removeAllListeners();
this.socket.socket.removeAllListeners();
},
log: function(msg) {
console.log('@@ Connect: '+msg);
}
});
E abaixo estão os resultados do meu console.log:
E abaixo está a minha janela de depuração node.js
Creio que a causa raiz desse cenário engraçado é que o @ anexado anteriormenconnect
ouvinte de evento não é removido completamente. Como devo removê-lo? Devo usaronce
? ou devo especificar a função de ouvinte também. Eu penseiremoveAllListeners()
é suficiente para esta tarefa.