質問:手動.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の結果である:
そして、以下の私のNode.jsのデバッグウィンドウ
である私はの根本的な原因を信じてこの面白いシナリオは、以前に添付されていたconnect
イベントリスナーが徹底的に動いた。どうすれば削除できますか? once
を使用する必要がありますか?リスナー機能も指定する必要があります。私はremoveAllListeners()
で十分だと思いました。
あなた 'register'イベントが右、' login'を意味しますか? –
ログイン累計登録の一種。しかし、私がconnectコールバックでconsole.logを実行すると、私は何も得られません。このコードが2度目に実行されると、ソケットオブジェクトが作成されますが、決してconnectイベントは発生しません。作成されたソケットオブジェクトには、socket.socket.connected falseがあります。私は、再接続メソッドがsocket.socketに現れているのを見ましたが、それが正しいかどうかはわかりません。試してみて、私のメソッドを複数回呼び出します。 –