web-dev-qa-db-ja.com

Node.js:socket.ioはクライアント接続を閉じます

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

私は使っている:

  • socket.io 0.9
  • node.js 0.10.15
  • エクスプレス3.3.4

つまり:localhost/testを呼び出します
- サーバ側

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();
};

これにより、クライアント側で切断イベントがトリガーされますが、2回または3回の応答が返されます。

41
baam

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

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

このような問題が発生した場合、自分のコードにバグがあると確信しています(サーバー側)。おそらく、いくつかのイベントハンドラをスタックすべきではない場所にスタックしている可能性があります。

9
freakish

試しましたか:

socket.disconnect() 

クライアントで?

67
Milan Babuškov

Socket.ioバージョン1.4.5の場合:

サーバー上:

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

クライアント上:

var io = io();
io.emit('end');
18
Himani Agrawal
socket.disconnect()

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

socket.close()

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

7
Ali Azhar

socket.disconnect()は、ソケットを手動で切断するsocket.close()と同義です。

クライアント側で入力するとき:

const socket = io('http://localhost');

これはautoConnect: trueとの接続を開くので、autoConnectionを無効にするために、サーバーからソケットを切断すると、libは再接続を再試行します。

const socket = io('http://localhost', {autoConnect: false});
socket.open();// synonym to socket.connect()

必要に応じて、手動で再接続できます:

socket.on('disconnect', () => {
  socket.open();
});
3
Ahmad Zahabi

バージョン1.0でユーザー接続を閉じようとしましたが、このメソッドが見つかりました。

socket.conn.close()

このメソッドとdisconnect()の違いは、クライアントがサーバーへの再接続を試行し続けることです。

2
JakubKnejzlik

クライアント側からイベントを発行して、サーバー側でsocket.disconnect(true)を試してください。

0

これを試して接続を閉じます:

socket.close();

また、もう一度開きたい場合:

socket.connect();
0
Luis Fletes