Как восстановить соединение после того, как вы позвонили .disconnect () - PullRequest
6 голосов
/ 07 марта 2012

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

Console screenshot

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

Node.js debug window

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

Ответы [ 6 ]

13 голосов
/ 09 марта 2012

Стандартный подход в последней версии socket.io:

socket.on('disconnect', function() {
    socket.socket.reconnect();
}

Это то, что я использовал в своем приложении и прекрасно работает. Это также гарантирует, что сокет продолжает пытаться переподключиться, если сервер работает, и в конечном итоге переподключается, когда сервер снова подключен.

В вашем случае вам необходимо обеспечить две вещи:

  1. Вы создаете сокет только один раз. Не звоните socket = io.connect(...) более одного раза.
  2. Вы настраиваете обработку событий только один раз, иначе они будут срабатывать несколько раз!

Поэтому, если вы хотите переподключить клиента, позвоните по номеру socket.socket.reconnect(). Вы также можете проверить это из консоли браузера в FireFox и Chrome.

2 голосов
/ 09 марта 2016

Я делаю так с socket.io 1.4.5, и, похоже, сейчас работает:

var app = {
    socket: null,
    connect: function() {
      // typical storing of reference to 'app' in this case
      var self = this;
      // reset the socket
      // if it's not the first connect() call this will be triggered
      // I hope this is enough to reset a socket
      if( self.socket ) {
        self.socket.disconnect();
        delete self.socket;
        self.socket = null;
      }
      // standard connectiong procedure
      self.socket = io.connect( 'http://127.0.0.1:3000', { // adapt to your server
        reconnection: true,             // default setting at present
        reconnectionDelay: 1000,        // default setting at present
        reconnectionDelayMax : 5000,    // default setting at present
        reconnectionAttempts: Infinity  // default setting at present
      } );
      // just some debug output
      self.socket.on( 'connect', function () {
        console.log( 'connected to server' );
      } );
      // important, upon detection of disconnection,
      // setup a reasonable timeout to reconnect
      self.socket.on( 'disconnect', function () {
        console.log( 'disconnected from server. trying to reconnect...' );
        window.setTimeout( 'app.connect()', 5000 );
      } );
    }
} // var app


app.connect();
2 голосов
/ 24 ноября 2014

Вы можете восстановить соединение, следуя конфигурации на стороне клиента.

 // for socket.io version 1.0
io.connect(SERVER_IP,{'forceNew':true };
1 голос
/ 15 сентября 2014

Мне кажется, это то, как вы справляетесь с разъединением ... Работал у меня с помощью socket.io - v1.1.0

неправильный путь ...

var sock = io( '/' );
sock.on( 'connect', function(x) { console.log( 'Connected', x ); } );
// now we disconnect at some point:
sock.disconnect();
// now we try to reconnect...
sock.connect()
// or    
sock.reconnect();
// - both seem to create the new connection in the debugger, all events are missing though

правильный путь ...

// As above with 3 extra characters, everything functions as expected...
//events fire properly...
sock.io.disconnect();
// consequently i'm also using (for consitency)
sock.io.reconnect();
// sock.connect() still seems to work however.
1 голос
/ 01 января 2014
socket.socket.connect();

соединяет вас.

0 голосов
/ 13 июня 2019

socket.io-client v2.2.0

import io from "socket.io-client"

var socket = io(url)  // initial connection

const reconnect = () => {
  if(!socket.connected) {
    socket = io(url)  // reconnects to a new socket
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...