2013-05-28 13 views
8

私は単純なチャットアプリケーションhereとsocket.ioとnode.jsを試しています。 node.jsサーバーを再起動するたびに、socket.ioは自動的に再接続し、何らかの形でサーバーへの接続をもう1つ作成します。つまり、クライアントは同じチャットメッセージを2度受信します。これをどうやって解決するのですか?socket.ioは再接続後にもう一度接続を作成します

答えて

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() { 
+0

理想的には、接続時にイベントリスナー(または他のアプリケーション機能)を追加しないでください。 – Shamps

+0

サーバー側では、これは名前空間を使用して修正できます。これにより、サーバー上のクライアントのtoe 'connect'イベントにも' once'を使います。 io.once( 'connect'、(socket:SocketIO.Socket)=> {}) 'はTSでコンパイルエラーを返し、' io.of( '/xyz').once('connect'、(socket:SocketIO.Socket)=> {}) 'はうまくいきます。 – Lion

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

私はあなたのソリューションが優れていると思います。ここで重要なのは、クライアントスクリプト内に、あなたが「接続」イベントから他のイベントを出したことです。 (接続イベントの外側にあるもの) –

関連する問題