2016-05-26 13 views
4

私は、いくつかの種類の情報更新のためのいくつかの部屋を購読する新しいSPAアプリケーションを作成しています。socket.io再接続時の会議室への再参加

私の製造環境では、信頼性のためロードバランサの背後に2台のサーバを使用します。

接続が切断された場合 - クライアントがreconnectイベントコールバックで部屋予約購読のリクエストを再送信する必要があるか、またはクライアントが別のサーバーに再接続した場合でもサーバーが自動的にクライアントに再接続する方法サーバ障害のため)

+0

この情報を入手できますか?同じことを私自身も気にする –

+0

@AugieGardnerが私の答えをチェックしてください。 – Raz

答えて

5

Socket.ioは、切断されたすべての部屋からユーザーを退室させます。サーバー側からあなたを退会させます。私はこれで少し遊んだ。サーバーは、ユーザーの部屋をレディスまたはデータベースにユーザーIDで保管し、接続時にそのユーザーがこれらの部屋にいるかどうかを確認することができます。ユーザーはクライアントから何もすることなく、サーバー側から参加できます。

問題は、この部屋のリストを常に保存して更新する必要があることです。それはバックエンドでシームレスに動作しなければならない別のものです。あなたの組織を台無しにするかもしれないすべての可能性を考慮することは、多くのテストです。同様に、別のデバイスにログインした場合、部屋をクリアして新しいものを置く必要がありますが、ユーザーがラップトップを再び開いて再接続すると、ラップトップからその部屋に戻らなければなりません。 ...それは完全に実行可能/解決可能ですが、フロントエンドでのみこれを行いました:

// rejoin if there's a disconnect 
    mySocket.on('reconnect',() => { 
    mySocket.emit('subscribe', 'theRoom') 
    }) 

...そしてそれ以上の手間はありません。なぜそれがサーバーからそれを行う必要があるかについていくつかの詳細を追加した場合..?

+0

最後に私はクライアント側でやった。ちょうどSocket.ioに内部メカニズムがあるのか​​どうか疑問に思った。ありがとう – ziv

+0

私はそれを得る。私が思うのは、socket.ioはソケットIDとサーバRAMの部屋を持つクライアントのリストを構築しなければならないということです。つまり、独自のガベージコレクションを追加する必要があります。これは、データに有効期限を追加することを意味します。いずれにしても、(ソケットセッションが終了した後にソケットが再接続された場合は)いずれにせよ再接続戦略を追加する必要があります。 –

+0

デスクトップとノートパソコンからの接続に関してちょうど言ったように、私はサブスクライブを「app」+「yourkey」と「desktop + yourkey」の2回としました。デスクトップとモバイルの両方を一度にアップデートできます。 – Raz

1

Socket.ioがreconnectイベントを持っている - 以下のようなDocs here

何かが試行再接続コールバックのようなものになります

socket.on('reconnect',() => attemptReconnection())

を動作するはずです:

const attemptReconnection =() => socket.emit('joinRoom', roomId)

0

私の経験から、私はこれを見つけました

クライアント側:

// the next 3 functions will be fired automatically on a disconnect. 
// the disconnect (the first function) is not required, but you know, 
// you can use it make some other good stuff. 

socket.on("disconnect", function() { 
    console.log("Disconnected"); 
}); 

socket.on("reconnect", function() { 
    // do not rejoin from here, since the socket.id token and/or rooms are still 
    // not available. 
    console.log("Reconnecting"); 
}); 

socket.on("connect", function() { 
    // thats the key line, now register to the room you want. 
    // info about the required rooms (if its not as simple as my 
    // example) could easily be reached via a DB connection. It worth it. 
    socket.emit("registerToRoom", $scope.user.phone); 
}); 

サーバー側:

io.on('connection', function(socket){ 
    socket.on("registerToRoom", function(userPhone) { 
    socket.join(userPhone); 
    }); 
}); 

そして、それをthatsの最も簡単で便利なソリューションであること。非常に単純でストレートです。

また、接続されたソケット(最後の機能)にインデックスを更新するなど、ユーザーのディスプレイにいくつかの更新を追加することもできます。