Вопрос: Как повторно подключить клиента к серверу после того, как вы выпустили руководство .disconnect()
?
В моем текущем проекте мне нужно отключить клиента от сервера, когда пользователь выходит из сеанса. Я сделал socket.disconnect()
для успешного отключения. Сервер удалил пользователя из сеанса.
Через некоторое время пользователь решил снова войти в систему, но socket.io отказывается подключаться.
Ясно, что в Socket.IO реализован алгоритм переподключения, но очевидно, что это другой случай.
Ниже показан фрагмент кода, в котором я выполняю подключение. При втором запуске этого блока кода объект сокет
был создан, но подключение
из этого объекта не было запущено.
//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');
});
ОБНОВЛЕНИЕ: По просьбе @Tony
На самом деле все это завернуто в Sencha Touch 2.0, но я считаю, что это не имеет ничего общего с ST2.0
Это мой класс данных. Использование этого класса - когда пользователь вошел в систему, этот класс будет инициализирован. И после выхода пользователя из системы система вызовет метод disconnect()
в этом классе.
Когда пользователь снова входит в систему, этот класс снова инициализируется, но забавно то, что сокет каким-то образом сохранил все предыдущие события и сеансы, которые у него были ранее.
/**
* 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);
}
});
А внизу моя консоль.результаты журнала:
А ниже мое окно отладки node.js
Я считаю, что основная причина этого забавного сценария заключается в том, что ранее подключенный прослушиватель событий connect
не был полностью удален. Как мне его удалить? Должен ли я использовать один раз
? или я также должен указать функцию прослушивателя. Я думал, что removeAllListeners()
достаточно для этой задачи.