50

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

私は使っている:

  • ソケット.io 0.9
  • ノード.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 回取得します。

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

更新
私は今、次のことを試しました:(クライアント側)

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

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

4

8 に答える 8

82

試しましたか:

socket.disconnect() 

クライアントで?

于 2013-08-08T12:59:21.933 に答える
12

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

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

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

于 2013-08-09T12:58:26.363 に答える
1

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

socket.close();

もう一度開きたい場合:

socket.connect();
于 2015-04-17T23:31:18.963 に答える
0

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

于 2015-12-30T13:05:29.633 に答える