2013-08-08 32 views
30

クライアント側でソケット接続を閉じるにはどうすればよいですか?Node.js:socket.io closeクライアント接続

私が使用しています: コールlocalhost/test
- サーバー:

  • 0.9 socket.ioのNode.js 0.10.15
  • は3.3.4

すなわちを表現側

var test = io 
.of('/test') 
.on('connection', function (socket) { 

    console.log('open socket: ' + socket); 

    socket.on('disconnect', function() { 
    console.log('disconnected event'); 
    //socket.manager.onClientDisconnect(socket.id); --> endless loop with this disconnect event on server side 
    //socket.disconnect(); --> same here 
    }); 
}); 

- クライアント側

var socket = io.connect('http://localhost:3000/test'); 
socket.on('disconnect', function() { 
    console.log('disconnect client event....'); 
}); 

socket.emit('getInitData', function (data) { 
    .. do something with data 
}); 

私は、サーバー(getInitData)からいくつかの値を必要とするテストページをロードした場合。
最初のページにアクセスして、データを1回取得します。リロードまたは2回目の訪問で、2回以上取得します。

サーバー側の接続は、ページの再ロード時およびページから離れると自動的に終了します。
しかし、クライアント側では接続はまだ開いています。
クライアント側で接続を閉じるか、すでに開いている接続があるかどうかを確認するにはどうすればよいですか?私は今、次の試してみました

UPDATE
:(クライアント側)

window.onbeforeunload = function(e) { 
    socket.disconnect(); 
}; 

これは、クライアント側で切断イベントをトリガし、私はまだ二回またはトリプル応答を取得します。

+0

どのように 'getInitData'イベントを処理しますか? –

+0

'getInitData'は、自分の書いたノードのアドオンからいくつかの値を返します。 これらの値はフォーム(チェックボックス、テキストフィールドなど)に設定されていますが、サーバーの接続が複数回開始されていることがわかりました。私がページをリロードするたびに、接続が閉じていても新しい接続が追加されます。 – baam

+1

サーバー側とブラウザ側に接続するようなものはありません。接続は1つだけです。一方の側がそれを閉じると、それは閉じられます(明らかに閉じている接続にデータをプッシュすることはできません)。ページを終了するときにブラウザーが接続を終了すると(使用しているライブラリーに依存しません)、これは少なくともWebSocketに当てはまります。このような問題が発生した場合は、自分のコード(サーバー側)にバグがあることを確信しています。イベントハンドラをスタックしないでください。 – freakish

答えて

7

サーバー側および/またはブラウザ側に接続するようなものはありません。接続は1つだけです。一方の側がそれを閉じると、それは閉じられます(明らかに閉じている接続にデータをプッシュすることはできません)。

ページを終了するとブラウザが接続を終了します(サーバー側で使用しているライブラリ/言語/ OSに依存しません)。これは少なくともWebSocketに当てはまります(keep-aliveのために長いポーリングには当てはまらないかもしれませんが、socket.ioがこれを正しく処理することを望みます)。

このような問題が発生した場合は、自分のコードに(サーバー側で)バグがあることを確信しています。イベントハンドラをスタックしないでください。

+7

* "次の行が" console.log( 'i am after dc')の場合は、 です。それを閉じて、それを閉じます "* - どのように各側からプログラム的に閉じますか?私はどんな文書も見つけられなかった –

57

あなたは試すました:クライアント上

socket.disconnect() 

を?

+0

いいえ、私はしませんでした。私はそれがサーバー側で切断イベントをトリガーするだけだと思った? いつ私はこれを引き起こすでしょうか? – baam

+0

私はあなたの質問でそれを忘れていますが、あなたはクライアント上の接続を閉じたいのですか? –

+0

サーバ接続が切断されるたびに。 (リロード/リフレッシュとページアンロード/リーブ) – baam

1

私はバージョン1.0のユーザーの接続をクローズしようと、この方法を見出しています:

socket.conn.close() 

この方法および切断(の差)は、クライアントがサーバーに再接続しようとし続けるということです。あなたは再びそれを開きたい場合は

socket.close(); 

と::

0

は、接続を閉じるにはこれを試して

socket.connect(); 
5
socket.disconnect() 

のみ、クライアント側で切断イベントを発射接続を再起動します。しかし、再び接続されます。

socket.close() 

クライアントからの接続を切断します。クライアントは接続を試み続けます。

0

クライアント側からイベントを送信するだけで、サーバー側でsocket.disconnect(true)を試してみてください。サーバー上で

:socket.ioバージョン1.4.5については

+0

真のargが何をすべきか? – netpoetica

13

クライアントで

socket.on('end', function(){ 
    socket.disconnect(0); 
}); 

var io = io(); 
io.emit('end'); 
+0

こんにちは。ありがとう、ありがとう。しかし、接続されたユーザーアレイからユーザーも削除されますか? – user3304007

+0

削除する必要がありますがわかりません。接続を閉じた後にユーザーアレイを印刷しようとしています。 –

+0

完了。ユーザーアレイを印刷するにはどうしたらいいですか?これの前に私は切断されたユーザーを削除するためにこれを使用していました。ユーザーを削除する[socket.nickname] – user3304007

関連する問題