Вопрос: Как вы переподключаете клиента к серверу после того, как вы выпустили руководство .disconnect()
?
В моем текущем проекте мне нужно отключить клиента от сервера, когда пользователь выходит из сеанса. Я сделал socket.disconnect()
, чтобы успешно отключиться. Сервер удалил пользователя из сеанса.
Через некоторое время пользователь решил снова войти в систему, но socket.io отказывается подключаться.
Мне ясно, что в Socket.IO реализован алгоритм переподключения, но, очевидно, это другой случай.
Ниже приведен фрагмент кода, где я делаю соединение. Во втором триггере этого блока кода был создан объект socket
, но из этого объекта не было запущено connect
.
//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);
}
});
И ниже мои результаты console.log:
И ниже мое окно отладки node.js
Я считаю, что основной причиной этого забавного сценария является то, что ранее подключенный connect
прослушиватель событий не был удален полностью. Как я должен удалить это? Должен ли я использовать once
? или я должен также указать функцию слушателя. Я думал removeAllListeners()
достаточно для этой задачи.