問題はソケットタイムアウトです。特定のソケットにアクティビティがない場合、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
を使用してデータにアクセスできます。
かなり賢い解決策、ありがとう:) –
これは巧妙な解決策ですが、それはサーバーとクライアントをピンポンで忙しくします:-(他の解決策ですか? –