2012-03-14 15 views
10

生産時には、ゲーム状態を保持するために接続ローカル変数を使用するゲームがあります。しかし、私は接続上で一定時間アイドル状態になると、現在の状態を失う接続を切断して再接続することに気付きます。ローカルホストでのテスト中に、私はこの動作に気付かなかった。これはソケット接続の標準的な動作か、接続が切断される原因となります。NodeJS + Socket.ioの接続がドロップ/再接続されていますか?

通常の動作であれば、これはどのように処理されるのですか?ユーザーがドロップ/再接続すると復元できるように、接続値をグローバルに格納する必要がありますか?

答えて

22

問題はソケットタイムアウトです。特定のソケットにアクティビティがない場合、socket.ioは自動的にそれを閉じます。

簡単な(そしてハッキリ)問題は、接続されたクライアントにハートビートを送信してアクティビティを作成し、ソケットがタイムアウトするのを止めることです。

サーバー:

function sendHeartbeat(){ 
    setTimeout(sendHeartbeat, 8000); 
    io.sockets.emit('ping', { beat : 1 }); 
} 

io.sockets.on('connection', function (socket) { 
    socket.on('pong', function(data){ 
     console.log("Pong received from client"); 
    }); 
} 

setTimeout(sendHeartbeat, 8000); 

クライアント:

socket.on('ping', function(data){ 
     socket.emit('pong', {beat: 1}); 
    }); 

詳細情報:

あなたはsocket.io here.

EDITの設定に関する詳細な情報を得ることができます:マークがあればとコメントユーザーが接続を失う(接続が切断されたインターネットのトラブルのために終了)、あなたは彼の最後の状態にユーザーを復元することができるはずです。

これを行うには、ユーザーデータ、Cookie、およびセッションを保存するために既に広く使用されている方法を使用するのが最善の方法です。

これを行う方法に関する非常によく行われたチュートリアルlocated here。彼はクッキーを設定するためにエクスプレスを使用していますが、何かを使ってこれを行うことができます(私はそれをレールを使って行います)。このメソッドを使用すると、ユーザーデータをCookieに格納し、ハンドシェイク中にフェッチすることができます。そこから、socket.handshake.dataを使用してデータにアクセスできます。

+0

かなり賢い解決策、ありがとう:) –

+2

これは巧妙な解決策ですが、それはサーバーとクライアントをピンポンで忙しくします:-(他の解決策ですか? –

0

必要な作業は、(再)接続ごとにセッションを作成または識別することです。上記のMooxの回答ごとに再接続数を減らすことはできますが、フェールセーフではありません。ユーザーはビットなどのために無線LAN接続を失います。つまり、ソケットごとではなくセッションごとにユーザーのメタデータを維持し、時折切断や再接続が発生することがあります。

+0

あなたはそうです、私はそれを考慮に入れて私の質問を編集しました。 – Moox

+0

私のアプリで行ったことは、セッションごとのユーザーデータを維持し、socket.io接続ではなく、ユーザーごとのセッションを接続/切断することです。私はこの機能がsocket.ioの動作に本当に "適合"しているとは思っていません。絶え間ない切断/再接続のために、使用しようとしてそれを放棄しました。 – Mark

関連する問題