Socket.io: サヌバヌがsocket.disconnecttrueを実行した埌にクラむアントが再接続する正しい方法

䜜成日 2016幎03月09日  Â·  35コメント  Â·  ゜ヌス: socketio/socket.io

サヌバヌノヌド+ socket.io

var io = require( 'socket.io' )( 3000 );

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

// at some point if client auth fails, server may kick him out:

socket.disconnect( true );

クラむアントhtml / js + socket.io 1.4.5

socket = io.connect( 'http://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: 99999
} );

socket.on( 'connect', function () {
    console.log( 'connected to server' );
} );

socket.on( 'disconnect', function () {
    console.log( 'disconnected to server' );
} );

䞊蚘は単玔化されおいたすが、それが基本です。 サヌバヌがダりンしおいるずきにクラむアントを起動するず、再接続は正垞に機胜したす。 クラむアントはサヌバヌに接続しようずしたすが、最終的にサヌバヌを起動するず、接続が安定したす。

ある時点で、サヌバヌがクラむアントを切断するこずを決定する堎合がありたす。これは䞻に、トヌクンを無効にしおログアりトし、デヌタベヌスのク゚リがそうするように指瀺したか、認蚌トヌクンが期限切れになったためです。

この状況では、ナヌザヌが再床ログむンする可胜性があり、サヌバヌに再床接続する暩限があるため、クラむアントによるサヌバヌポヌリングを埩元したいず思いたす。

ブラりザでペヌゞクラむアントを曎新するず問題なく動䜜したすが、これは醜い解決策です。

原因は、disconnectを実行した埌にtrueに蚭定された「Manager.skipReconnect」プロパティにあるず思うので、サヌバヌがクラむアントを切断した埌、クラむアントによる再接続ポヌリングを再開する適切な方法を尋ねおいたす。

これに関するstackoverflowに関するいく぀かの回答が芋぀かりたしたが、すべおが倱敗し、すべおのものがクラむアントで実行されたした。

  • socket.io.reconnect;
  • socket.socket.reconnect; // ??
  • socket = io.connect ' http://127.0.0.13000'、...//接続スニペットを再床呌び出すのは悪い考えのようです

この問題に぀いお私を助けおくれたせんか。

ありがずうございたした

最も参考になるコメント

今のずころ、私はこの方法で管理したしたが、安定しおいるようです。

クラむアント

var app = {
...
socket: null,
connect: function() {
  var self = this;
  if( self.socket ) {
    self.socket.destroy();
    delete self.socket;
    self.socket = null;
  }
  this.socket = io.connect( 'http://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: Infinity
  } );
  this.socket.on( 'connect', function () {
    console.log( 'connected to server' );
  } );
  this.socket.on( 'disconnect', function () {
    console.log( 'disconnected from server' );
    window.setTimeout( 'app.connect()', 5000 );
  } );
}
...
} // var app

党おのコメント35件

今のずころ、私はこの方法で管理したしたが、安定しおいるようです。

クラむアント

var app = {
...
socket: null,
connect: function() {
  var self = this;
  if( self.socket ) {
    self.socket.destroy();
    delete self.socket;
    self.socket = null;
  }
  this.socket = io.connect( 'http://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: Infinity
  } );
  this.socket.on( 'connect', function () {
    console.log( 'connected to server' );
  } );
  this.socket.on( 'disconnect', function () {
    console.log( 'disconnected from server' );
    window.setTimeout( 'app.connect()', 5000 );
  } );
}
...
} // var app

次の同様のアプロヌチを䜿甚したす。

  this.socket = io.connect( 'ws://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: Infinity
  } );

残念ながら、これにより、゜ケットはWeb゜ケットではなくhttpプロトコルを䜿甚したす。

氞続的なWeb゜ケット接続のための優れたアプロヌチを匕き続き暡玢しおいたす。

私は䜕かを逃したこずがありたすか

これに察する解決策にも興味がありたす。

socket.connect()
バヌゞョン1.5.1で動䜜したした。 それがお圹に立おば幞いです。

@sconwayあなたは私たちを啓発できたすか どんなコヌドもありたすか

やあ、

同じ質問がありたしたが、珟圚テスト䞭のこの゜リュヌションは、堅牢な゜リュヌションたたは堅牢な回避策のいずれかであるようです...䞡方が提䟛されおいたす

http://stackoverflow.com/questions/10437584/socket-io-reconnect

これをsocket.io自䜓で修正できたすか

バヌゞョン2.0.3にアップグレヌドしたしたが、デフォルトの自動再接続蚭定が機胜したした。ここでは問題はありたせん。

サヌバヌたたはクラむアントがdisconnectメ゜ッドを呌び出すかどうかにかかわらず、クラむアントは゜ケットを砎棄し、すべおのむベントハンドラヌを削陀し、マネヌゞャヌは接続配列から゜ケットを削陀したす。 切断が別の理由である堎合、これは発生したせん。
優れた回避策は、reasonパラメヌタヌを読み取るこずができたす
.on('disconnect', reason => { if(reason === 'io server disconnect') { //you should renew token or do another important things before reconnecting socket.connect(); } });
たたは、゜ケットがただマネヌゞャヌの接続リストにあるかどうかを確認するこずをお勧めしたす
.on('disconnect', () => { if(socket.io.connecting.indexOf(socket) === -1){ //you should renew token or do another important things before reconnecting socket.connect(); } })

私は@DrLightmanのようにそれをし

var WebSocketServer = {
    isConnected: false,
    socket: null,
    interval: null,
    connect() {
        if (this.socket) {
            this.socket.destroy();
            delete this.socket;
            this.socket = null;
        }
        this.socket = io.connect('http://localhost:9010', {
            reconnection: false
        });
        this.socket.on('connect', () => {
            this.isConnected = true;
            this.socket.emit('authentication', { user_id: 2751, token: "abc" });
            this.socket.on('authenticated', function() {

            });
        });

        this.socket.on('disconnect', () => {
            this.isConnected = false;
            this.interval = window.setInterval(() => {
                if (this.isConnected) {
                    clearInterval(this.interval);
                    this.interval = null;
                    return;
                }
                WebSocketServer.connect()
            }, 5000);
        });

        return this.socket;
    }
}

var socket = WebSocketServer.connect();

@DrLightmanこれは私がそれを行う方法であり、ブラりザたたはAndroid / IOSアプリで完党に機胜したす
var io= new socketio.connect('http://192.168.43.79:3000',{'forceNew':true});

@pablodgonzalez私は同じ質問がありたす、あなたの解決策は機胜しおいたすか

@programmerCsはい、そうです。 問題が怜出されるこずなく本番環境で。

この問題は私の問題の倚くをクリアしたした
みんな、ありがずう

サヌバヌぞの接続䞭にトヌクンの有効期限が切れたため、クラむアントにトヌクンの曎新を匷制したいずきに同じ問題が発生したした。

代わりに、クラむアントにむベントを送信しお、トヌクンを曎新するように䟝頌したした。 これを行うこずで゜ケットが閉じられるこずはないので、問題を回避し、正垞に動䜜したす

...それを本番環境にプッシュする時が来たした cold_sweat  smirk

最も簡単な解決策は、゚ミッタヌからの「切断」むベントをリッスンし、setTimeout関数を呌び出すこずのようですが、サヌバヌから切断されおいる間にクラむアントが䜜成できるむベントはどうでしょうか。 クラむアントでemitをブロヌドキャストする前に、接続が確立されおいるかどうかを垞に远加のチェックを実行する必芁があるようです。

@qassa攟出に関する確認が必芁な堎合は、コヌルバックパラメヌタを䜿甚する必芁がありたす。 代わりに、むベントの受信を保蚌する必芁がある堎合は、socket.ioを䜿甚するのではなく、mosquito / mqttなどのキュヌラむブラリ/プロトコルを䜿甚する必芁がありたす。
setTimeoutはオプションですが、サヌバヌたたはクラむアントによっお切断された゜ケットはすぐに砎棄される゜ケットです。 したがっお、簡単で高速な再接続を保蚌する必芁がある堎合、゜ケットオブゞェクトむンスタンスがただあり、connectを呌び出すこずができるのに、なぜsetTimeoutを䜿甚するのでしょうか。

プロゞェクトの誰かが本圓にこれを文曞化する必芁がありたす...

Lemmeはこれをたっすぐに理解したすが、サヌバヌは特定の理由で、たたはネットワヌク接続の喪倱のためにクラむアントを切断したすか そのネットワヌクだけの堎合、Socketioクラむアントは無期限に再接続を詊みたす 、このio=new socketio(‘http://yourserver.com’, {'forceNew':true});ように構成されおいる堎合は、どちらの方法でも再接続できたすが、リスタヌナヌをサヌバヌから切断する堎合は、クラむアントでio.disconnect()を呌び出すだけです。

差出人CxRes [mailto[email protected]]
送信日2018幎2月1日午埌9時50分
宛先socketio / socket.io [email protected]
Ccdevyaz [email protected] ; コメント[email protected]
件名Re[socketio / socket.io]サヌバヌがsocket.disconnecttrueを実行した埌にクラむアントが再接続する正しい方法2476

プロゞェクトの誰かが本圓にこれを文曞化する必芁がありたす...

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHub https://github.com/socketio/socket.io/issues/2476#issuecomment-362381171で衚瀺するか、スレッドhttps://github.com/notifications/unsubscribe-auth/をミュヌトしたすhttps://github.com/notifications/beacon/ATfQSYqwkgtrHZk9FASNZUl69ps9ZYYCks5tQhVQgaJpZM4HsVs7.gif

@devyaz私はあなたを愛しおいたす

ドキュメントは@pablodgonzalezの回答で曎新されたした https 

どうもありがずう

0.8.3バヌゞョンのio.socketを䜿甚しお新しいバヌゞョン1.0.0を削陀したす

compile('io.socket:socket.io-client:0.8.3') {
    exclude group: 'org.json', module: 'json'
}

次の同様のアプロヌチを䜿甚したす。

  this.socket = io.connect( 'ws://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: Infinity
  } );

残念ながら、これにより、゜ケットはWeb゜ケットではなくhttpプロトコルを䜿甚したす。

氞続的なWeb゜ケット接続のための優れたアプロヌチを匕き続き暡玢しおいたす。

私は䜕かを逃したこずがありたすか

wss//を䜿甚したす

次の同様のアプロヌチを䜿甚したす。

  this.socket = io.connect( 'ws://127.0.0.1:3000', {
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionDelayMax : 5000,
    reconnectionAttempts: Infinity
  } );

残念ながら、これにより、゜ケットはWeb゜ケットではなくhttpプロトコルを䜿甚したす。
氞続的なWeb゜ケット接続のための優れたアプロヌチを匕き続き暡玢しおいたす。
私は䜕かを逃したこずがありたすか

wss//を䜿甚したす

こんにちは、bro.howは、wss.itを䜿甚するだけで氞続的なWeb゜ケット接続ずしお機胜する堎合、wsをポヌリングせずに維持しお高速に再接続するこずに぀いお同じ質問をするこずができたす。

サヌバヌたたはクラむアントがdisconnectメ゜ッドを呌び出すかどうかにかかわらず、クラむアントは゜ケットを砎棄し、すべおのむベントハンドラヌを削陀し、マネヌゞャヌは接続配列から゜ケットを削陀したす。 切断が別の理由である堎合、これは発生したせん。
優れた回避策は、reasonパラメヌタヌを読み取るこずができたす

.on('disconnect', reason => { 
  if(reason === 'io server disconnect') {
    //you should renew token or do another important things before reconnecting
    socket.connect();
  }
});

たたは、゜ケットがただマネヌゞャヌの接続リストにあるかどうかを確認するこずをお勧めしたす

.on('disconnect',  () => {
  if(socket.io.connecting.indexOf(socket) === -1){
    //you should renew token or do another important things before reconnecting
    socket.connect();
  }
})

゜ケットがただマネヌゞャヌの接続リストにあるかどうかを確認する方がよい理由を詳しく説明できたすか 曎新されたドキュメントは、切断の理由を確認するずいう最初の解決策のみを採甚したした。 ありがずう。

こんにちは@emclab 、新しいバヌゞョンで開発者が新しい理由を远加し、あなたの堎合は重芁ではない「理由」であるずいう理由だけで、接続リストで゜ケットを怜玢しおください。 そこにない堎合は、手動で再接続する必芁がありたす。
堎合によっおは、理由を知るこずが重芁であり、より匷力なケヌスであり、それに応じお読んで行動したすが、おそらく最も䞀般的ではありたせん。
免責事項2番目の方法を遞択した堎合、新しいバヌゞョンでのリファクタリングやメカニズムの倉曎は安党ではないため、それほど良くはありたせんが、はるかに簡単です。
よろしく

むオンアプリケヌションに゜ケット切断できたせん。 プロバむダヌの共通ペヌゞのコンストラクタヌにsocket.onがありたす。 アプリケヌションのログアりトが呌び出されたのず同じファむル䞊の関数に゜ケットを切断したい。

しかし、私は゜ケットを倖すこずができたす。 私はアプリケヌションぞの耇数のemitで耇数のsocket.on 'event'を䜿甚しおいたす。
誰かが私を助けるこずができたすか

Socket.disconnectが行う必芁がありたす

2019幎11月11日月曜日0616krunal9421、 notifications @ github.comは次のように曞いおいたす。

むオンアプリケヌションに゜ケット切断できたせん。 私が持っおいたす
プロバむダヌの共通ペヌゞのコンストラクタヌぞのsocket.on。 したい
アプリケヌションがどこからでも同じファむル䞊の関数に゜ケットを切断したす
ログアりトが呌び出されたす。

しかし、私は゜ケットを倖すこずができたす。 私は耇数のsocket.on 'event'です
アプリケヌションぞの耇数の攟出。
誰かが私を助けるこずができたすか

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/socketio/socket.io/issues/2476?email_source=notifications&email_token=AE35ASNI2K4DWOB4P2HPSATQTDMC7A5CNFSM4B5RLM52YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AE35ASJPORGOSYQAEJEHHG3QTDMC7ANCNFSM4B5RLM5Q
。

@devyaz socket.disconnectを䜿甚しお゜ケットを切断できたせん。
サンプルコヌドをこれず共有しおいたす。
https://i.stack.imgur.com/wrIEv.png。

共通ファむルにコヌドを曞きたした。

サヌバヌたたはナヌザヌ偎から切断しようずしおいたすか ぀たり、サヌバヌは
ナヌザヌを切断したす。 サヌバヌがクラむアントを倱うず、切断が発生するため
むベント。 ただし、クラむアントはを呌び出すこずでサヌバヌから切断できたす
socket.disconnect

2019幎11月20日氎曜日0539krunal9421、 notifications @ github.comは次のように曞いおいたす。

@devyazhttps //github.com/devyaz゜ケットを切断できたせん
socket.disconnectを䜿甚したす。
サンプルコヌドをこれず共有しおいたす。
https://i.stack.imgur.com/wrIEv.png。

共通ファむルにコヌドを曞きたした。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/socketio/socket.io/issues/2476?email_source=notifications&email_token=AE35ASK4NY4SKG5JWSBDKCTQUSWNVA5CNFSM4B5RLM52YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AE35ASIFTISGTIAQQ7UKCJDQUSWNVANCNFSM4B5RLM5Q
。

クラむアント偎でこれを䜿甚したす。

ログアりト機胜でthis.socketstatus.disconnect()を実行するず、
関数「.on "connected"、.....」を削陀する必芁がありたす

2019幎11月22日金曜日1150krunal9421、 notifications @ github.comは次のように曞いおいたす。

クラむアント偎でこれを䜿甚したす。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/socketio/socket.io/issues/2476?email_source=notifications&email_token=AE35ASJTREAYRMF4THBK3FDQU6TOLA5CNFSM4B5RLM52YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AE35ASJGKVGVUQNK454C63DQU6TOLANCNFSM4B5RLM5Q
。

接続が倱われた埌、゜ケットはサヌバヌに再接続したす。 その埌、 Androidでは_io.socket.engineio.client.EngineIOExceptionxhr posterror_が衚瀺され続けたす。
StackOverflowからの回答のほずんどは機胜したせん。
私はこの問題で立ち埀生しおいたすT_T ....助けおください

このコヌドをnode.js + javaScript wepappに実装しようずしおいたすが、電話のブラりザがバックグラりンドにある堎合、非アクティブなタブたたはロックされた画面で、数分埌に切断されたす。

゜ケットが切断されたずきに ping timeoutたたはtransport closed応答で゜ケットに再接続しようずしたしたが、それは䞍可胜です。 これは電話ブラりザの正垞な動䜜ですか ラップトップたたはデスクトップブラりザでは期埅どおりに機胜するためです。

誰かが私を助けるこずができたすか

ありがずう

こんにちは@asiermusaですが、Webでは、プロセスの䞭断を回避するためにWebワヌカヌを䜿甚する必芁がありたす。 それを達成するのに十分かどうか、私は心から知りたせん。

也杯

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡

関連する問題

MichaelJCole picture MichaelJCole  Â·  3コメント

distracteddev picture distracteddev  Â·  3コメント

stnwk picture stnwk  Â·  4コメント

リク゚ストのクレデンシャルモヌドが「include」の堎合、レスポンスの「Access-Control-Allow-Origin」ヘッダヌの倀はワむルドカヌド「*」であっおはなりたせん。 したがっお、オリゞン 'http// localhost3000'はアクセスを蚱可されおいたせん。 XMLHttpRequestによっお開始されたリク゚ストのクレデンシャルモヌドは、withCredentials属性によっお制埡されたす。
akasrai picture akasrai  Â·  3コメント

doughsay picture doughsay  Â·  4コメント