2017-01-29 14 views
7

私はsocket.io(1.5)を使用してServercodeこのシンプルなNode.jsの持っている:私はいくつかのケースでは、このコードウントのF5キーを押し、数回実行した場合Node.jsのSocket.ioページリフレッシュの複数の接続

var io = require('socket.io').listen(8080); 

io.on('connection', function(socket) { 

    console.log(' %s sockets connected', io.engine.clientsCount); 

    socket.on('disconnect', function() { 
     console.log("disconnect: ", socket.id); 
    }); 
}); 

を古い接続が切断される前に新しい接続が作成されます。しばらくすると、Heartbeat Timoutと思って、すべての接続が閉じられます。結果を参照してください:

2 sockets connected 
3 sockets connected 
4 sockets connected 
5 sockets connected 
6 sockets connected 
7 sockets connected 
8 sockets connected 
9 sockets connected 
10 sockets connected 
11 sockets connected 
disconnect: 0h_9pkbAaE3ftKT9AAAL 
11 sockets connected 
12 sockets connected 
13 sockets connected 
14 sockets connected 
disconnect: oB4HQRCOY1UIvvZkAAAP 
14 sockets connected 
15 sockets connected 
disconnect: LiIN0oDVoqbePgxFAAAR 
15 sockets connected 
16 sockets connected 
17 sockets connected 
18 sockets connected 
disconnect: zxvk-uhWABHzmu1uAAAV 
18 sockets connected 
19 sockets connected 
20 sockets connected 
disconnect: FlboxgTzcjf6ScffAAAY 
20 sockets connected 
21 sockets connected 
disconnect: 9UGXbnzukfGX_UtWAAAa 
21 sockets connected 
disconnect: pAfXOEz6RocKZdoZAAAb 
21 sockets connected 
disconnect: DIhTyVgG2LYBawaiAAAc 
21 sockets connected 
disconnect: W4XOc1iRymfTE2U0AAAd 
21 sockets connected 
disconnect: WZzegGPcoGDNLRTGAAAe 
21 sockets connected 
22 sockets connected 
disconnect: KVR3-fYH0cz77BmgAAAC 
disconnect: ANQknhnxr4l-OAuIAAAD 
disconnect: KZE5orNx6u9MbOArAAAE 
disconnect: TS6LL3asXrcznfcPAAAF 
disconnect: SVNxS3I7KqecdqKhAAAG 
disconnect: IE2WE5Y0PJzvxgBfAAAH 
disconnect: v69bdJav9PjpThBGAAAI 
disconnect: mJKT1ggfOOTshZKgAAAJ 
disconnect: YlycVjdcWe0emCAcAAAK 
disconnect: MoIDJSzP_L-1RUwuAAAM 
disconnect: wAl0x5qwCkrnDDYQAAAN 
disconnect: eiTlPEk2Hx_X-L-fAAAO 
disconnect: KgkrXxzG_EpXOsPTAAAQ 
disconnect: Lvf3kK-6XXEbu3NWAAAS 
disconnect: -hOoGdYOIvVK04K_AAAT 
disconnect: 3EUmaAYpK-U3Ss9tAAAU 
disconnect: HQ6M98FebtKlU3OfAAAW 
disconnect: OwgrbRBYbS4j84nmAAAX 
disconnect: yN8FZAP4RjUNl2MeAAAZ 
disconnect: K9IFTjlgAWzdNfpUAAAf 

、私の質問は: これはバグですか、これはsocket.ioの正常な動作ですか?どのように私は接続フラッディング、簡単に押すF5を防ぐことができますか?

よろしく マルク・

+0

ブラウザを更新してから切断すると、ブラウザはWebSocketを開いて閉じる必要があります。そうでなければ、それはブラウザのバグでしょう。ブラウザがwebSocketをすぐに閉じないと、socket.ioは(ハートビートのために)ソケットがもはやアクティブではなくなって、ソケットが最終的にクリーンアップされるのを見るでしょう。 – jfriend00

+0

これはすべての実際のブラウザで発生します。 – mcbookwood

+0

F5キーを押したときから最終的に切断されるまでの時間はどのくらいですか?また、接続が切断されたときにカウントが下がるのを表示しないため、何かが間違っているように見えます。 – jfriend00

答えて

10

私は自分自身のテストアプリを作って、何が起こっているかを把握することができました。

F5キーを何度も押すと、一時的にChromeでいくつかのsocket.io接続が蓄積されますが、比較的短時間(数分)以内に回復し、接続されたソケットの総数が戻ってきます

さらにテストした結果、これはブラウザの問題ではないことが判明しました。これは、socket.ioがsocket.io接続をどのように開始するかに関する問題です。あなたがクライアントでこれを交換する場合:これで

var socket = io(); 

var socket = io({transports: ['websocket'], upgrade: false}); 

ONLYのWebSocketを使用して、HTTPポーリングを使用することはありませんにsocket.ioを強制的に、問題が消えます。

この問題は、socket.ioのデフォルトの動作がhttpポーリングバージョンのsocket.io接続で開始されるためです。少しのデータが交換された後、socket.ioは実際のwebSocketに切り替えようとします。その実際のwebSocketが動作する場合、httpポーリング接続の使用は停止します。

しかし、ポーリングと実際のwebSocketとの間の移行の途中でF5を押すと、socket.ioが永続的な接続を確立していないことがわかります。だから、後でそのWebページからの着信通信がなくなったので、それがsocket.io接続(あなたがF5を押すとポーリングモードにあった)をクリアするはずです。

しかし、上記のクライアントコードで初期ポーリングモードをオフにすると、実際のwebSocket(シミュレーションされたポーリングモードは使用されません)が使用され、ブラウザはヒット時にwebSocketをきれいに整理できますF5を押すと、サーバーはsocket.io接続の確立を完了していません(その場合、一時的に孤立する接続はまだありません)。または既にWebSocketに変換されています(ブラウザはF5で正常に終了します)。

これは、socket.ioが起動するhttpポーリングモードの設計上の制限です。このモードでは連続接続がないため、ブラウザがF5で置き換えられたときにブラウザからすぐに通知されません。したがって、サーバーはクライアントが消えたことを知る方法がありません。しかし、httpポーリングモードをスキップして、実際のwebSocketで始めると、socket.io接続が存在するが、実際のwebSocketは存在しないので、WebSocketを閉じるブラウザによってサーバに常に通知されますページがなくなったときの接続。

+0

ああ、それは理にかなっています。また、クライアントとサーバー上のソケット接続を編集した後も、問題は発生しません。この説明をありがとう! – mcbookwood

関連する問題