クライアント側でソケット接続を閉じるにはどうすればよいですか?
私は使っている:
つまり: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回の応答が返されます。
サーバー側および/またはブラウザ側の接続などはありません。接続は1つだけです。いずれかの側が閉じた場合、それは閉じられます(明らかに閉じられている接続にデータをプッシュすることはできません)。
これで、ページを離れるとブラウザが接続を閉じます(サーバー側で使用しているライブラリ/言語/ OSに依存しません)。これは、少なくともWebSocketには当てはまります(keep-alive
が原因で長時間のポーリングには当てはまらないかもしれませんが、socket.ioはこれを正しく処理します)。
このような問題が発生した場合、自分のコードにバグがあると確信しています(サーバー側)。おそらく、いくつかのイベントハンドラをスタックすべきではない場所にスタックしている可能性があります。
試しましたか:
socket.disconnect()
クライアントで?
Socket.ioバージョン1.4.5の場合:
サーバー上:
socket.on('end', function (){
socket.disconnect(0);
});
クライアント上:
var io = io();
io.emit('end');
socket.disconnect()
クライアント側での接続起動切断イベントのみを再起動します。しかし、再び接続されます。
socket.close()
クライアントから接続を切断します。クライアントは接続を試行し続けます。
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();
});
バージョン1.0でユーザー接続を閉じようとしましたが、このメソッドが見つかりました。
socket.conn.close()
このメソッドとdisconnect()の違いは、クライアントがサーバーへの再接続を試行し続けることです。
クライアント側からイベントを発行して、サーバー側でsocket.disconnect(true)
を試してください。
これを試して接続を閉じます:
socket.close();
また、もう一度開きたい場合:
socket.connect();