Socket.io-client: 接続->切断->接続が機能しない

作成日 2011年07月23日  ·  33コメント  ·  ソース: socketio/socket.io-client

次のコードは私には機能しません:
socket = io.connect( 'http://host.com:8081'); socket.disconnect(); socket = io.connect( 'http://host.com:8081');

これは私が見つけた回避策です:
socket = io.connect( 'http://host.com:8081'); socket.disconnect(); delete io.sockets [' http://host.com:8081 ']; io.j = [];ソケット= io.connect( 'http://host.com:8081');

Unable to reproduce bug

最も参考になるコメント

これを使用してください: io.connect(null,{'force new connection':true});

全てのコメント33件

ここで同じ問題-あなたが説明した方法で接続-切断-再接続できませんでした。

しかし、私は次のことがうまくいくことを発見しました。 奇妙なことに、setTimeoutを省略してすぐに再接続すると(またはタイムアウトが短すぎると)、すぐに切断されます。

var ns = io.connect(
        '/',
        { reconnect: false }
    ),
    numDisconnects = 2;

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

    console.log('Connected');

    if (numDisconnects > 0) {
        console.log('Disconnecting');
        ns.socket.disconnect();

        setTimeout(function () {
            console.log('Reconnecting');
            ns.socket.connect();
        }, 5000);
    }
    numDisconnects--;


});

ns.on('disconnect', function () {
    console.log('Disconnected');
});

ソケット= io.connect(host);
socket.disconnect();
socket.socket.reconnect(); || socket.socket.connect(host);
動作しますが、再接続または2番目の接続切断が数秒ごとに発生するため

同じ問題が発生したため、このバグが原因でノードノックアウトエントリを時間内に完了できませんでした:(
他の失恋の前にそれを修正してください!

上記の回避策はどれも私にはうまくいきませんでした。 みんな、これは深刻なショーストッパーです。 なぜ「複製できない」タグなのですか? 私のテスト環境。 OS X10.6上の最新のChromeです。

私は同じことを見ています。 また、 io.connect()もう一度呼び出すと、エラーなしで失敗します。 誰かが回避策を見つけましたか?

これを使用してください: io.connect(null,{'force new connection':true});

どれほど便利で、醜い。 何取り外しについてio.sockets[uuri] = socket;からio.js:196 ? そのオチのポイントは何ですか?

残念ながら、ここでも同じ問題が発生します。 切断後は再接続できません。

切断後に私のために働いた唯一のもの:
io.j = [];
io.sockets = [];

編集:それはクライアント側のdisconnect()の1つの問題だけではありません。 切断時にデータ構造をクリーンアップしません-SocketNamespace。$ eventsには、閉じた接続などのすべてのコールバックがまだあることがわかります。

@MrJoesはio.connect(null,{'force new connection':true});使用します

さて、これは本当に再接続するための最後のAPIですか? かなり奇妙です。

@skrat私はあなたに同意します。 io.reconnect APIが必要です。

そうは思いません。 io.connectio.disconnectio.connectに、期待どおりに機能するはずです。

@milani :io.sockets []に残っている孤立したソケット、イベントハンドラーなどが原因で、メモリがリークしますか?

正直に言うとあまり良い考えではありません。

@MrJoesメモリリークについてよろしいですか? @ 3rd-io.socketのEdenから、このAPIを使用するように言われました。

'force new connection'を渡しても、io.sockets []にソケットは追加されません。

ただし、多重化が失われているため、特にエンドポイントでは少し醜いです。多重化を行うには、io.socketsのソケットに依存しています。

ソケットプロトタイプを介した再接続を使用するという@Gorokhovの提案は、私にとってはうまくいきました。
socket.socket.reconnect()
ありがとう

ここでも同じ問題があります-socket.reconnect()が機能していません。他のいくつかの回避策を試してみます。 これは残念なことですが、アップデートを中断するための非常に基本的な機能です。 このため、多くのアプリケーションが簡単に更新できないと確信しています。

開発者が問題を再現するための支援が必要な場合は、喜んでお手伝いします。このバグに「再現できません」というタグが付いているのを見て驚いています。

このプルリクエストにより、まもなくメジャーアップデートが行われるようです: https
@cacois socket.reconnect()ではなくsocket.socket.reconnect()を使用してみてください

ああ、素晴らしいニュース:-)

@ wackfordjf3こんにちは、よろしく

再接続に関する問題がまだ発生しています。
2回目の再接続により、サーバーで複数の再接続イベントが発生します。 (そしてこれはその後の再接続ごとに増加します)。 名前空間で再接続を起動しています。

socket = io.connect(url {'reconnect':false}); socket.disconnect; //最初の切断
socket.socket.reconnect(); socket.disconnect(); // 2番目の切断
socket.socket.reconnect(); // 2回目の再接続

オン:ソケット。 [email protected]

これに加えて:
醜い方法はうまくいきます:
io.sockets [url]; io.j = [];を削除します
ソケット= io.connect(url);

人々がすでにここに持っているのと同じことに直面します。 名前空間のシナリオではさらに奇妙です。 名前空間のソリューションを削除します。

var base = ' http:// localhost :3000'
、channel = '/ chat'
、url =ベース+チャネル;

var socket = io.connect(url);

// socket.disconnect()を呼び出しても切断されないため、次のようになります。
io.sockets [base] .disconnect();

//構文を再接続します。
io.sockets [base]を削除します。 io.j = [];
ソケット= io.connect(url);

注:socket.ioバージョン-0.9.0、プラットフォーム:Windows7ホームプレミアム

午後は、切断後に接続できなかったためにタイムアウトになったユニットテストと格闘しました。 {'force new connection':true}で問題が解決しました。 ありがとう@milani

ここでCucumber.jsを使用して同じ問題が発生します。 オブジェクトを作成して破棄する必要があるため、同じ接続、切断、接続に直面していましたが失敗しました。 Thx @ milani@rawberg

わたしにはできる! @mrjoesに感謝します。

ありがとう@milani

この問題が再び発生した可能性がある場合、v1.0リリースでは「新しい接続を強制する」設定は「forceNew」と呼ばれるようになりました。

私はそれでBCを追加するコミットをプッシュしたので、すぐに誰もこの問題を抱えることはなくなります!

4 me、socket = io.connect(socketUrl、{'forceNew':true});で動作しました。

forceNewは名前空間多重化システム全体を無効にしますが、それは本当に解決策ですか?

私が使用しているもの:
socket = io.connect()
..。
// この
socket.io.reconnect()
..

Client.prototype.connect = function() {
    if (!this.connection) {
        this.connection = this.socket.connect(config.host + ':' + config.port);
    }
    else {
        if (!this.connection.connected) {
            this.connection.connect();
        }
    }
};

io.connect(null、{'新しい接続を強制する':true});

これで私の問題は解決します、ありがとうございます。 ミラミ

このページは役に立ちましたか?
0 / 5 - 0 評価