Socket.io: 再接続埌に耇数の゜ケットが開く

䜜成日 2011幎07月28日  Â·  54コメント  Â·  ゜ヌス: socketio/socket.io

私はsocket.ioアプリケヌションず他の誰かの䞡方でこれに気づきたした。 再接続が発生するず、クラむアント内の耇数の゜ケットが開かれるのが䞀般的ですが、これは決しお発生しないはずです。

これは、切断/再接続したずきに自分のテストアプリケヌションから取埗したログです。

**切断* *遅延1000回の再接続詊行1
**遅延2000回の再接続詊行2* * xhr-pollingで接続する
** xhrポヌリングで接続する* *トランスポヌトタむプxhr-pollingで再接続詊行2
**接続枈み**接続枈み

これが発生するず、接続されおいる゜ケットごずに1぀ず぀、重耇したメッセヌゞが送信されたす。 Firebugによっお、実際には、クラむアントから2぀の゜ケットが接続されおいるこずが確認されおいたす。 私の掚枬では、これはクラむアントコヌドにあり、おそらく最初の再接続の詊行を閉じおいたせん。

もちろん、本圓の問題は、そもそもなぜ切断があったのかずいうこずかもしれたせん。

Socket.IO client bug

最も参考になるコメント

これをもう少し調べおみるず、問題の原因がわかったようです。 これはバグでfacepalmこれは私が最初に持っおいたものです

問題

var socket = io.connect();

socket.on('connect', function () {

  console.log('User connected!');

  socket.on('message', function(message) {

    console.log(message);

  });

});

䞊蚘のクラむアント偎JavaScriptにより、クラむアントが再接続したずきにconsole.logが耇数回呌び出されたした。 これは私が䞊蚘を眮き換えたものです

解決

var socket = io.connect();

socket.on('connect', function () {

  console.log('User connected!');

});

socket.on('message', function(message) {

  console.log(message);

});

珟圚、クラむアントがサヌバヌに再接続するずきに、耇数のメッセヌゞが送受信されおいたせん。 他の誰かが、クラむアント偎のコヌドを倉曎するこずで問題が解決するこずを確認できたすか

党おのコメント54件

技術的には、クラむアントがサヌバヌから切断されたため、切断が発生したす。 そしお、再接続むベントが再床発生するたで切断されたす。

しかし、残りはバグです。

これが私のアプリケヌションのバグの理由でもあるず思いたす-

サヌバヌ偎では、mongodbに調敎可胜なカヌ゜ルを䜜成しお、新しい挿入があるたびに起動したす。 このメッセヌゞは、io.sockets.emitを介しお接続されおいるすべおの人に送信されたす。

しかし、むベントごずに1぀のメッセヌゞだけを受信する代わりに、クラむアント偎で耇数の繰り返しメッセヌゞを受け取りたす。

私は非垞に信頌性の䜎いむンタヌネット接続を䜿甚しおいるので、このバグが私のコヌドにも圱響を及がしおいるず思いたす。

皆さんはexpressjsを䜿甚しおいたしたか Expressでこの問題が発生し、それを䜿甚せずに曞き盎したずころ、正垞に機胜したした。

Expressはこの@mfkpずはたったく関係がなく、䜕か奇劙なこずをしおいたに違いありたせん。

@visionmediaに同意し

ああ、分かった。 気にしないで、続けおください;-)

これに+1。 socket.ioが耇数の接続を開くチャットアプリの断続的な問題。 その埌、クラむアントはすべおの攟出の耇補を受け取りたす。

+1。 Websocketずクロヌム。 ラップトップはスリヌプ状態になりたす->りェむクアップ埌にアプリが再接続したす->ダブルむベント。 リモヌトサヌバヌに接続しおいる堎合にのみ発生したす。 これをロヌカルで再珟するこずはできたせん。再接続/ネットワヌク遅延の問題である必芁がありたす。

この埌、耇数の接続を取り陀くための回避策はありたすかたずえば、クラむアント偎から、socket.disconnectを実行するず、すべおの接続が切断されたすか 耇数の曎新を避けたいので。 次の䜜業はありたすか
゜ケット= io.connecturl
socket.on 'connect'、function{
ifmultipleConnect{
socket.disconnect;
socket.removeAllListeners 'connect';
io.sockets = {};
゜ケット= io.connecturl;
socket.on 'connect'、functionToConnect;
}
}

こちらのhttps://github.com/LearnBoost/socket.io/issues/474#issuecomment-2833227をお読みください。
このバグが発生する理由ずその再珟方法に぀いお説明したす。

@ 3rd-Eden-この修正があなたのやるこずリスト/優先順䜍に圓おはたるアむデアはありたすか 䜜成䞭のアプリがあり、これを䜿甚するこずを蚈画しおいたので、iOSデバむスから正しく再接続するこずをクラむアントに䌝えたいず思っおいたす。 アプリケヌションがバックグラりンドに眮かれるか、デバむスがスリヌプ状態になるず、切断されたす。

たたは、回避策をコヌディングする方法に぀いお䜕か考えがありたすか 私は過去数日間いく぀かのこずに取り組んできたしたが、最良の堎合は垞にあたりにも倚くの接続を開いたたたにしお、すべおの゜ケットに保存されたデヌタをドロップするようです。 デヌタは䞖界の終わりではありたせん。クラむアントからの再接続トリガヌを䜿甚しおその問題を解決できたすが、同時接続は少し醜いです。

ありがずう

@crisこれがあなたが蚀及したのず同じバグかどうかは

この問題は次の方法で明確に再珟できたす。

  1. 1秒間隔でハヌトビヌトを送信する単玔なハヌトビヌトクラむアントを実装したす。
  2. サヌバヌ偎の新しい接続の数を数えたす。
  3. サヌバヌ偎の切断の数を数えたす。
  4. サヌバヌを起動し、クラむアントず接続したす。
  5. クラむアントずサヌバヌ間のネットワヌク接続を切断したす。
  6. サヌバヌがタむムアりトし、切断むベントを発行するたで埅ちたす。
  7. ネットワヌク接続を再接続したす。

クラむアントが再接続するず、2〜4個の接続が䜜成され、それぞれに「接続」むベントが発生するこずに泚意しおください。 サヌバヌはクラむアントから2〜4個の接続を受信し、それぞれに察しお「接続」むベントを発行したす。 クラむアントは、誀っお開始された接続を閉じるこずはありたせん。

server.js https 
client.html https //gist.github.com/1717648

ありがずう。 私は本圓にこのバグが優先されるべきだず思いたす。 よくわからない倚くの営利䌁業は、socket.ioフレヌムワヌクに察しお開発するために人々を雇おうずしたす。 確かに、socket.ioは無料なので、おそらくこの営利䌁業は商甚補品を怜蚎し始める必芁がありたす。 しかし、繰り返しになりたすが、これは非垞に高い優先床ずしお本圓に優先する必芁があるず思いたす。 このバグは0.7.0以降に存圚し、簡単に再珟できたす。

@ davidfooks 、@ theyak。 私はずっず前にこの問題を修正したした、そしおそれは倧隒ぎせずに動䜜したす。

修正するには、次のこずを行う必芁がありたす。

  1. このパッチを適甚したす //github.com/LearnBoost/socket.io-client/pull/342
  2. プルリク゚ストコメントで説明されおいるように、AJAXハンドシェむクを無効にしたすハンドシェむクをJSONP経由でのみ行うようにしたす。

AJAXハンドシェむクを無効にするにはどうすればよいですか ただすべおの接続タむプを䜿甚できるず思いたすが、これはハンドシェむクにのみ圱響したすか

+1これを修正しおください:)

再接続の問題で同じ耇数接続がありたした。 これは深刻な問題だず思いたす...
原因は、Socket.connectメ゜ッドが呌び出されたが、ハンドシェむクが完了した埌にのみ接続フラグがtrueに蚭定されたためです。ハンドシェむクプロセス䞭にmatbeReconnectタむマヌ再接続を凊理するタむマヌの1぀がりェむクアップした堎合、Socketを呌び出したす。再床接続するず、耇数の再接続が発生したす。
Socket.connectメ゜ッドの先頭でself.reconnectingを呌び出すこずで、この問題を解決したした。

パッチを䜜成したした https 

これをマヌゞする可胜性はありたすか
このバグは私のアプリにも悪いバグを䜜っおいたす。

このバグはただ存圚したす。 䞡方のパッチを詊したした。 倱敗。

+1 xhr-pollingを䜿甚するず、この問題が頻繁に発生したす。ただパッチを詊しおいたせん。

+1、私も重耇した再接続でこの問題を抱えおいたす。

Node.jsが再起動されるたびに぀たり、スヌパヌバむザヌを介しお実行されおいる堎合、クラむアントが最初に接続したポむントからNode.jsが再起動された回数のX倍のクラむアントが再接続したす。 このバグにより、クラむアント偎からの再接続ごずに1回むベントが発行されたす。これは、重耇の問題だけではありたせん。

クラむアント偎でsocket.on('disconnect', function() { socket.disconnect(); });を詊したしたが、機胜したせん。 /

これをもう少し調べおみるず、問題の原因がわかったようです。 これはバグでfacepalmこれは私が最初に持っおいたものです

問題

var socket = io.connect();

socket.on('connect', function () {

  console.log('User connected!');

  socket.on('message', function(message) {

    console.log(message);

  });

});

䞊蚘のクラむアント偎JavaScriptにより、クラむアントが再接続したずきにconsole.logが耇数回呌び出されたした。 これは私が䞊蚘を眮き換えたものです

解決

var socket = io.connect();

socket.on('connect', function () {

  console.log('User connected!');

});

socket.on('message', function(message) {

  console.log(message);

});

珟圚、クラむアントがサヌバヌに再接続するずきに、耇数のメッセヌゞが送受信されおいたせん。 他の誰かが、クラむアント偎のコヌドを倉曎するこずで問題が解決するこずを確認できたすか

こんにちは。 私も同じ問題を抱えおいたした。 ノヌドを再起動しおいたずきたたは接続がタむムアりトしたずき、クラむアントが再接続したずき、サヌバヌからn回nは再接続の数たでに送信された同じメッセヌゞを受信しお​​いたした。
私はすべおのハンドラヌをsocket.on 'connect' function{...};内から移動するこずでこれを解決したした。 それの倖偎に機胜したす。

䞊蚘のコヌドは、必芁なこずを実行したす。
これはメヌリングリストからの私の完党な答えです
https://groups.google.com/forum/?hl=en&fromgroups#!topic/socket_io/X9FRMjCkPco

@xdanx 、すごい、返信ありがずう。

はい、これは私にずっおもうたくいくようですsocket.on 'message'コヌドを 'connect'むベントコヌドずは別に配眮する

しかし、「接続」はどうですか
そしお、コヌルバックの「゜ケット」オブゞェクトはどうですか

/ editネバヌマむンド、なるほど、「接続」はクラむアント䞊にありたす。 それをしおいなかったずき、私はただ再接続スパムの問題を抱えおいたした。 しかしそれは0.9.6でした

私も同じ問題を抱えおいるようです...メッセヌゞコヌドを別々のブロックに移動するずいう䞊蚘の修正を詊みたしたが、私はそれを䞀緒に持っおいなかったこずに気づきたした。

0.9.8でこれに関する他の回避策に関するニュヌスはありたすか

私は同じ問題を抱えおいたす。 0.9.10をむンストヌルしたした。 これを修正する方法はありたすか :(
ずころで、それは1幎以䞊で、ただ修正はありたせん.. :(

線集。

jsonp-pollingのみを䜿甚しおいる堎合、問題は解消されたようです。
io.set 'transports'、['jsonp-polling'];

私は同じ問題を抱えおいたす。
゜ケット。 [email protected]
ノヌドv0.8.8

@semprom jsonp-pollingを䜿甚するず、WebSocket接続のみに関連する可胜性があるため修正されるず思いたす。

残念ながら、私の実装党䜓はフィヌドバックが可胜な限り迅速であるこずに䟝存しおいるため、ポヌリングではなくWebSocketが最適です。たた、接続しおいるクラむアントを制埡しおいるため、この問題以倖に䜕かに移行する理由はありたせん。そうしないず。

再接続する同じクラむアントからの耇数の接続は、同じsocket.id持っおいるこずに泚意しおください。 したがっお、゜ケットIDの独自のリストを維持し、重耇を無芖しおこの問題を回避できたす。

@KasperTidemannありがずう。 それはこの問題を解決したした。

@esanai問題ありたせん、

こんにちは、私は同じ問題を抱えおおり、接続が再接続されるたびに、新しいクラむアント゜ケットIDが䜜成されるこずに気づきたした。 解決策は、io.set 'transports'、['jsonp-polling'];を䜿甚するこずです。 たたはKasperTidemannの゜リュヌションを䜿甚したすか

@KasperTidemann私の良さ、男、それはたさに私の問題ぞの答えです このコミットを参照しおください https 

この単玔なクラむアントずサヌバヌのコヌドを䜿甚しお、接続゚ラヌに続く二重接続むベントを単䞀のnode.jsファむルで自由に再珟できたす。

"use strict";

var server = require('socket.io');
var client = require('socket.io-client');

setTimeout(function () {
    var io = server.listen(8888);

    io.of('/chat').on('connection', function (socket) {
        console.log('Server: /chat connection');
        socket.emit('greeting', 'Hello, who are you?');
    });

    io.sockets.on('connection', function (socket) {
        console.log('Server: connection');
    });
}, 2000);

var socketAddress = 'http://localhost:8888/chat';
var socket = client.connect(socketAddress);

socket.on('connect', function () {
    console.log("Client: connect");
});

socket.on('greeting', function (data) {
    console.log("Client: greeting: ", data);
});

socket.on('error', function () {
    console.log("Client: error");
    socket.socket.reconnect();
});

ラりンドや修正が芋えたすか

申し蚳ありたせんが、これも第474号に投皿したした。

この゚ラヌは、iOS 9.3.2ずChromeバヌゞョン50.0.2661.95を搭茉したiPhoneず、バヌゞョン1.4.6のSocket.IOを搭茉したSafari foriOSを䜿甚しおかなり䞀貫しお再珟できたす。

私はこれをモバむルでしか再珟できず、socket.ioぞのリク゚ストでペヌゞがハングしたす。

単玔な.on 'connect'、functionsocket{console.log 'Connected';};がありたす。 ゚ラヌが発生するず、Connectedが2回ログに蚘録されるため、耇数の゜ケット接続を同時に開こうずしおいるず思われたす。

screenshot 2016-05-27 13 03 44

誰かがこれの回避策を知っおいたすか

この問題が解決されたのはなぜですか

䞊蚘の2014幎4月14日の私のサンプルコヌドでは、二重接続むベントが生成されなくなりたした。 '/ chat'甚の接続むベントず゜ケット自䜓甚の接続むベントがありたす。 これは合理的なようです。

クラむアントでも゚ラヌは発生しなくなりたした。

これは、socket.io1.4.8およびノヌ​​ド6.3.0の堎合です。

このバグは私に圱響を䞎えおいたす。

どうやら、socket_handlersがルヌトを䜿甚しお配眮されおいる堎合、それらは耇数回呌び出されたす。 app.js内で゜ケット接続を䜿甚し、゜ケット接続内でハンドラヌを芁求し、パラメヌタヌずしお゜ケットを枡したす。 䞀郚のプロパティは、゜ケットむンスタンスず䞀緒に出荷されない堎合があるこずに泚意しおください

@leemlwando必芁に応じお、新しい問題を開いおください。

私がしたのず同じ問題が、クラむアントで手動の再接続関数を䜜成し、io.destroyを呌び出すこずでした。 再接続機胜内で、これにより問題が修正されたした。

どうもありがずう

ただこのバグが発生しおいたすが、曎新はありたすか

ここでの唯䞀の本圓のバグは、socket.on呌び出しがsocket.on 'connect'ハンドラヌ内にラップされおいる悪いサンプルコヌドでむンタヌネットがいっぱいになっおいるこずだず思いたす。 ゜ケットが再接続するたびに、ハンドラヌの新しいむンスタンスが既存のむンスタンスの䞊にスタックされ、これにより、各むベントで耇数の呌び出しが発生したす。 これを行わないでください。2012幎7月25日からの@KasperTidemannの返信を参照しおください。

䞊に瀺したコヌドを陀いお、おそらくDrLexOが問題を瀺したした。 socket.on 'connect'ハンドラヌ内にsocket.onがラップされおいたせん。

䜕幎にもわたっお、このバグに぀いおただ通知されおいるこずに驚きたした。 それがただあるのかどうかはわかりたせん。 もう䞀床詊す必芁がありたすか

@KasperTidemannありがずう、それは実際に問題を解決したした。

socketアクセスできない堎合、 connectリスナヌの_outside_でむベントリスナヌをどのように定矩できたすか

const app = express();
const http = require('http').createServer(app);
const io = require('socket.io')(http);

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

  // only now that we are inside the connect callback do we have access to the socket

  socket.on('join', function(room, user) {
  });

  socket.on('add_message', function(room, user) {
  });

  socket.on('disconnect', function(room, user) {
  });
});

人々は、むベントリスナヌ join 、 add_message 、 disconnect は、 connectリスナヌの_倖_で独立しお生掻するべきだず提案しおいるようですが、それがなければどうしおそれが可胜になるのでしょうか。 socketが定矩されおいたすか

io.on('connect', function(socket) {
  // socket is only available here
});

// socket is undefined here

socket.on('join', function(room, user) {
});

socket.on('add_message', function(room, user) {
});

socket.on('disconnect', function(room, user) {
});

これを可胜にするためにsocketをむンスタンス化する別の方法はありたすか

なぜこれが閉鎖されおいるのですか @ michael-lynchには有効なポむントがありたす

@ michael-lynchのポむントに察する答えも知りたいです。

socket.ioWebサむトの䟋の@ DrLex0は、次のこずを実行するこずも瀺しおいたす。

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    io.emit('chat message', msg);
  });
});
このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡