1. ホーム
  2. javascript

[解決済み] Node.js:socket.ioがクライアント接続を閉じる

2022-03-05 18:59:45

質問

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

使っています。

  • socket.io 0.9
  • node.js 0.10.15
  • express 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回取得し、といった具合に。

サーバー側の接続は、ページの再読み込みとページからの離脱時に自動的に切断されます。
しかし、クライアント側では、接続はまだ開いたままです。
クライアント側で接続を閉じるか、すでに接続が開かれているかどうかを確認するにはどうすればよいですか?

アップデイト
今、以下のように試してみました。(クライアント側)

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

これは、クライアント側で切断イベントをトリガーしますが、まだ二重、三重の応答があります。

どうすればいいですか?

サーバ側とブラウザ側で接続することはできません。接続は1つだけです。どちらかが閉じれば、それは閉じられます(そして、閉じられたコネクションにデータをプッシュすることは当然できません)。

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

もしこのような問題が起こるなら、あなた自身のコード(サーバー側)にバグがあるのは間違いないでしょう。もしかしたら、重ねるべきでないイベントハンドラを重ねているのかもしれません。