调用.disconnect()后如何重新连接

Lio*_*han 6 javascript websocket node.js socket.io

问题:在您发布手册后如何将客户端重新连接到服务器.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');
});
Run Code Online (Sandbox Code Playgroud)

更新:根据@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);
    }
});
Run Code Online (Sandbox Code Playgroud)

以下是我的console.log结果:

控制台截图

以下是我的node.js调试窗口

Node.js调试窗口

我相信这个有趣场景的根本原因是以前附加的connect事件监听器没有彻底删除.我应该如何删除它?我应该用once吗?或者我也应该指定监听器功能.我认为removeAllListeners()这足以完成这项任务.

Ton*_*leh 13

最新socket.io中的标准方法是:

socket.on('disconnect', function() {
    socket.socket.reconnect();
}
Run Code Online (Sandbox Code Playgroud)

这是我在我的应用程序中使用的并且工作得很好.它还确保套接字在服务器运行时继续尝试重新连接,并在服务器重新联机时最终重新连接.

在您的情况下,您需要确保两件事:

  1. 您只创建一次套接字.不要socket = io.connect(...)多次打电话.
  2. 您只设置一次事件处理 - 否则它们将被多次触发!

因此,当您想重新连接客户端时,请致电socket.socket.reconnect().您还可以在FireFox和Chrome中的浏览器控制台中对此进行测试.