2012-03-07 9 views
4

質問:手動.disconnect()を発行した後、クライアントをサーバーに再接続するにはどうすればよいですか?.disconnect()を呼び出した後に再接続する方法

私の現在のプロジェクトでは、ユーザーがセッションからログアウトするときに、サーバーからクライアントを切断する必要があります。私はsocket.disconnect()を実行して切断に成功しました。サーバーがユーザーをセッションから削除しました。

しばらくして、ユーザーは再度ログインすることを決めましたが、socket.ioは接続を拒否しました。

Socket.IOが再接続アルゴリズムを実装していることは間違いありませんが、これは明らかに異なるケースです。

以下は、私が接続を行うコードの一部です。このコードブロックの2回目のトリガでオブジェクト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'); 
}); 

UPDATE:全体のことは煎茶タッチ2.0の下で包まれている事実

@Tonyによって要求されたが、私は信じていたよう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()で十分だと思いました。

+0

あなた 'register'イベントが右、' login'を意味しますか? –

+0

ログイン累計登録の一種。しかし、私がconnectコールバックでconsole.logを実行すると、私は何も得られません。このコードが2度目に実行されると、ソケットオブジェクトが作成されますが、決してconnectイベントは発生しません。作成されたソケットオブジェクトには、socket.socket.connected falseがあります。私は、再接続メソッドがsocket.socketに現れているのを見ましたが、それが正しいかどうかはわかりません。試してみて、私のメソッドを複数回呼び出します。 –

答えて

12

最新socket.ioでの標準的なアプローチは次のとおりです。

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

これは私が私のアプリで使用して素晴らしい作品ていたものです。また、サーバーが途中で切断された場合にソケットが再接続を試み、サーバーがオンラインに戻ったときに最終的に再接続するようにします。あなたのケースでは

、あなたは二つのことを確保する必要があります。

  1. あなたは一度だけあなたのソケットを作成します。 socket = io.connect(...)に複数回電話をかけないでください。
  2. イベント処理は1回のみ設定します。それ以外の場合は、複数回起動されます。

したがって、クライアントに再接続する場合は、socket.socket.reconnect()に電話してください。 FireFoxとChromeのブラウザコンソールからもこれをテストすることができます。

+0

切断後、socket.socket.reconnect()を実行しますが、驚くことに複数の 'connect'が起動しました。私は 'removeAllListeners()'を実行することができましたが、それでもなお複数の 'connect'が起動されました。溶液? –

+0

@LionelChan複数の接続イベントの原因となっている更新されたコードを投稿できますか? –

+0

私の質問に追加 –

0
socket.socket.connect(); 

を再接続します。

1

がsocket.io使用して私のために働いた...それはあなたが切断を処理する方法であるように思える -

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 

正しい方法... V1.1.0

間違った方法を...

// 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. 
2

次のクライアント側の設定で再接続できます。

// for socket.io version 1.0 
io.connect(SERVER_IP,{'forceNew':true }; 
1

私は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(); 
関連する問題