私は単純なチャットアプリケーションhereとsocket.ioとnode.jsを試しています。 node.jsサーバーを再起動するたびに、socket.ioは自動的に再接続し、何らかの形でサーバーへの接続をもう1つ作成します。つまり、クライアントは同じチャットメッセージを2度受信します。これをどうやって解決するのですか?socket.ioは再接続後にもう一度接続を作成します
8
A
答えて
13
デフォルトでは切断socket.ioによって、接続が再接続され、connect
イベントが再実行されます。だから毎回再接続すると、メッセージを受け取るためにもう1つイベントリスナーを追加します。したがって、サーバーの再起動/接続の切断と同じ数のメッセージが取得されます。
Incoming Chat:
Connected
dsdadsada
Disconnected //recieved by 1st listener
Connected //added 2nd listener
adasd
Disconnected //recieved by 1st listener
Disconnected //recieved by 2nd listener
Connected //added 3rd listener
あなたは最初だけのEventHandler初めて走るonce
代わりのon
を、使用して接続するに耳を傾ける必要があります。代わりに、このようにのindex.htmlを書くようにしてください
iosocket.once('connect', function() {
代わりの
iosocket.on('connect', function() {
5
をお試しください:
iosocket.on('connect', function() {
$('#incomingChatMessages').append($('<li>Connected</li>'));
});
iosocket.on('message', function(message) {
$('#incomingChatMessages').append($('<li></li>').text(message));
});
iosocket.on('disconnect', function() {
$('#incomingChatMessages').append('<li>Disconnected</li>');
});
それは他の2つのEventListenerによって引き起こされる可能性がに登録されましたconnectイベント。 クライアントが切断されると、残りの2人のリスナーがここに残り、登録解除されません。
+1
私はあなたのソリューションが優れていると思います。ここで重要なのは、クライアントスクリプト内に、あなたが「接続」イベントから他のイベントを出したことです。 (接続イベントの外側にあるもの) –
関連する問題
- 1. JSPlumb接続の切断後に接続を再作成
- 2. Socket.io '切断イベント'が再接続後に遅すぎます。
- 3. はSocket.IOインターネット接続
- 4. Socket.IO接続クライアントリスト
- 5. Socket.IOはCloudflareでWebsocketを再接続し続ける
- 6. Socket.ioは複数回接続します
- 7. Socket.IOはParams Androidと接続します
- 8. perl dbi再接続時に再接続
- 9. NodeJS + Socket.ioの接続がドロップ/再接続されていますか?
- 10. RxJS socket.io retryWhen()との再接続
- 11. データベース接続に失敗しました:AD接続を作成できません:[DB接続](接続)
- 12. socket.ion、socket.io-clietn、接続
- 13. クローズド接続socket.io android
- 14. Socket.io - 低速接続
- 15. Socket.io - nodejsサーバー側。再接続後に閉じる
- 16. AzureホストでSocket.ioクライアントが再接続し続ける
- 17. ネットワーク再接続後にSQLサーバーの接続が失敗する
- 18. socket.io-emitterを通じてSocket.IOに接続
- 19. socket.ioでどのように再接続するのですか?
- 20. 接続の中断後にOracle接続プールを自動再接続する方法はありますか。
- 21. 一度閉じたカフカプロデューサーを再接続するには?
- 22. ネットワーク障害による切断イベントの接続の再接続 - Socket.io
- 23. Socket.io - クライアント側の切断後の手動再接続
- 24. Socket.ioサーバーオフラインで接続します。
- 25. Tomcatの接続プーリング、アイドル状態の接続、接続の作成
- 26. プロシージャでは、2つのデータベースに接続します。ローカルともう一方のリモートに接続します。
- 27. socket.ioは接続ごとに複数のソケットを作成します
- 28. API接続は一度しか動作しません
- 29. socket.ioは一貫して接続されていません
- 30. 再帰的接続スレッドの作成
理想的には、接続時にイベントリスナー(または他のアプリケーション機能)を追加しないでください。 – Shamps
サーバー側では、これは名前空間を使用して修正できます。これにより、サーバー上のクライアントのtoe 'connect'イベントにも' once'を使います。 io.once( 'connect'、(socket:SocketIO.Socket)=> {}) 'はTSでコンパイルエラーを返し、' io.of( '/xyz').once('connect'、(socket:SocketIO.Socket)=> {}) 'はうまくいきます。 – Lion