2012-03-02 11 views
3

私はNode.jsとSocket.IOでマルチルームチャットアプリを書いています。トランスポートがxhr-pollingのときに、セッションの持続時間を維持する必要のあるデータをどう扱うかと思います。xhrポーリングを伴う永続データをSocket.IOに保存するにはどうすればよいですか?

現在、クライアント上では、接続時に(ユーザー名などの)長い変数を渡す「結合」イベントを送信しています。これは、Socket.IOのgetおよびsetメソッドを使用してサーバー側を格納します。これらは、クライアントが切断するまで利用可能です。

トランスポートがWebsocketの場合は正常ですが、xhrポーリングに戻った場合は、各接続で5〜10秒ごとに発生します。私は前方に最善の方法が何であるかわからないんだけど

(同様に、望ましくない各XHRポーリング要求、上で送信されます。「などと、このようなは/部屋が参加を残しています」)。私はxhrポーリングを無効にすることはできません。なぜなら、フラッシュレスIEのために必要なフォールバックだからです。

socket.on("connect", function(){ 
    socket.emit("join", { username: username, room: room }); 
}); 

、サーバー上:事前に

var io = require("socket.io").listen(8124) 
, buffer = {} 
, max_room_buffer = 15; 

io.sockets.on("connection", function(socket) { 
    socket.on("join", function(data){ 
     if(data.username && data.room) { 
     socket.set("data", data); 
     socket.join(data.room); 
     if(!buffer[data.room]) buffer[data.room] = []; 
     socket.broadcast.to(data.room).emit("message", "<em>" + data.username + " has joined room " + data.room + "</em>"); 
     socket.emit("message", "<em>You have joined room " + data.room + "</em>"); 
     socket.emit("message", buffer[data.room]); 
    } 
}); 

socket.on("message", function(message) { 
    if(message) { 
     socket.get("data", function(err, data){ 
      if(data) { 
       var msg = "<span>" + data.username + ":</span> " + message; 
       buffer[data.room].push(msg); 
       if(buffer[data.room].length > max_room_buffer) buffer[data.room].shift(); 
       io.sockets.in(data.room).emit("message", msg); 
      } 
     }); 
    } 
}); 

socket.on("disconnect", function() { 
    socket.get("data", function(err, data){ 
     if(data) { 
      socket.leave(data.room); 
      socket.broadcast.to(data.room).emit("message", "<em>" + data.username + " has left room " + data.room + "</em>"); 
     } 
    }); 
}); 

}); 

おかげでここ

は、関連するクライアントコードです。

+0

私はsocket.io自体がその代わりのを扱うべきではないと思います開発者はそれを扱う..奇妙な。 「その同じこと –

+0

は、わからない、「AJAXマルチストリーミング」であればわからない、サポートされるだろうが、私はすることができますGoogle上で何かを見つけたようです。これに対処するためのベストプラクティスがありますが、socket.ioの新機能です。 –

+0

は、私は、これはすべてのチャットアプリはsocket.ioとに実行し、問題なければならないことを考えた場合、私はチャンク転送エンコードのようなものを推測 – Mottokrosh

答えて

2

おそらく私は何かが欠けているかもしれませんが、この作品はありません。

クライアント:

var firstJoin = true; 
socket.on("connect", function(){ 
    socket.emit("join", { username: username, room: room, firstJoin: firstJoin }); 
    firstJoin = false; 
}); 

サーバー:接続するイベントがXHRポーリングの避けられない結果だ、すべての新しい世論調査で発生しているという事実については

io.sockets.on("connection", function(socket) { 
    socket.on("join", function(data){ 
     if(data.username && data.room) { 
     socket.set("data", data); 
     socket.join(data.room); 
     if(!buffer[data.room]) buffer[data.room] = []; 

     if (data.firstJoin) { 
      socket.broadcast.to(data.room).emit("message", "<em>" + data.username + " has joined room " + data.room + "</em>"); 
      socket.emit("message", "<em>You have joined room " + data.room + "</em>"); 
      socket.emit("message", buffer[data.room]); 
     } 
    } 
}); 

。各ポーリングは新しいHTTP要求であるため、以前の要求からの状態はないため、再度設定する必要があります。

あなたはこの問題が発生する頻度を減らしたい場合は、例えば、20のデフォルトからのポーリング時間を増やしてみてください:

io.configure(function() { 
    io.set('polling duration', 60); 
}); 
+0

問題のいくつかを処理するように見えます。クライアントが特定の時間内にpingを実行しなかった場合、イベントを発生させる方法がない限り、ユーザーが実際に切断したときに通知なしで生きていなければなりません。 – Mottokrosh

+0

ええ、それは解決するのは簡単な問題ではありません。理論的には切断イベントは、(私はデフォルトの '近いtimeout'が25秒だと思います)、しばらくして発射する必要がありますが、遅延が発生する場合があります。http://stackoverflow.com/questions/6280569/socket-io-xhr-polling -delay-on-disconnection –

+0

Rohanに感謝、そのスレッドをチェックアウトします。私はあなたの答えをupvoteしたいと思いますが、私はまだ十分な評判を持っていない新しいユーザーとして! – Mottokrosh

関連する問題