Как переподключиться после того, как вы вызвали .disconnect()

Вопрос: Как повторно подключить клиента к серверу после того, как вы выпустили руководство .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);
    }
});

А внизу моя консоль.результаты журнала:

Console screenshot

А ниже мое окно отладки node.js

Node.js debug window

Я считаю, что основная причина этого забавного сценария заключается в том, что ранее подключенный прослушиватель событий connect не был полностью удален. Как мне его удалить? Должен ли я использовать один раз? или я также должен указать функцию прослушивателя. Я думал, что removeAllListeners() достаточно для этой задачи.

6
задан Lionel Chan 9 March 2012 в 05:00
поделиться