Apakah ada cara untuk memutuskan klien dengan SocketIO, dan benar-benar menutup koneksi? Jadi, jika seseorang terhubung ke server saya, dan saya ingin menutup koneksi antara mereka dan server saya, bagaimana saya akan melakukannya?
Apakah ada cara untuk memutuskan klien dengan SocketIO, dan benar-benar menutup koneksi? Jadi, jika seseorang terhubung ke server saya, dan saya ingin menutup koneksi antara mereka dan server saya, bagaimana saya akan melakukannya?
Jawaban:
Edit: Ini sekarang mungkin
Anda sekarang dapat memanggil socket.disconnect()
di sisi server .
Jawaban asli saya:
Ini belum memungkinkan.
Jika Anda membutuhkannya juga, pilih / komentari masalah ini .
iptables
), semakin banyak sumber daya yang akan Anda hemat. Dalam banyak kasus, hanya dengan menendang klien saja sudah cukup, karena socketio tidak terhubung secepat itu, dan jika seseorang benar-benar ingin melakukan DoS kepada Anda, mereka tetap memiliki cara lain (misalnya mendownload halaman dari Anda).
socket.disconnect()
hanya dapat digunakan di sisi klien, bukan di sisi server.
Client.emit('disconnect')
memicu peristiwa pemutusan hubungan di server, tetapi tidak secara efektif memutuskan klien. Klien tidak mengetahui pemutusan hubungan.
Jadi pertanyaannya tetap: bagaimana cara memaksa klien untuk memutuskan koneksi dari sisi server?
Client.emit('disconnect')
secara manual lagi dengan versi socket.io terbaru, sekarang ada sisi server socket.disconnect()
(lihat jawaban saya).
socket.disconnect()
bisa digunakan di sisi server juga.
disconnect()
fungsi selesai?
Ada alasan mengapa Anda tidak dapat meminta server mengirimkan pesan ke klien yang membuatnya memanggil fungsi putuskan sambungan?
Pada klien:
socket.emit('forceDisconnect');
Di Server:
socket.on('forceDisconnect', function(){
socket.disconnect();
});
Dengan asumsi soket Anda bernama soket, gunakan:
socket.disconnect()
Bagi mereka yang menemukan ini di google - ada solusi untuk ini sekarang:
Socket.disconnect()
menendang klien (sisi server). Tidak ada kesempatan bagi klien untuk tetap terhubung :)
disconnect
untuk mengetahui apakah sudah terputus. Bisa juga close
acaranya, saya kurang yakin. Lihat dokumentasi socket.io untuk informasi lebih lanjut tentang ini.
Memeriksa pagi ini tampaknya sekarang:
socket.close()
Dalam kasus saya, saya ingin meruntuhkan koneksi yang mendasarinya dalam hal ini saya harus menelepon socket.disconnect(true)
seperti yang Anda lihat diperlukan dari sumbernya di sini
Socket.io menggunakan pola EventEmitter untuk memutuskan / menghubungkan / memeriksa detak jantung sehingga Anda dapat melakukannya. Client.emit('disconnect');
Ini tidak berhasil untuk saya:
`socket.disconnect()`
Ini berhasil untuk saya:
socket.disconnect(true)
Menyerahkan true
akan menutup koneksi yang mendasari ke klien dan bukan hanya namespace klien yang terhubung ke Dokumentasi Socket IO .
Contoh kasus penggunaan: Klien memang terhubung ke server soket web dengan token akses yang tidak valid (token akses diserahkan ke server soket web dengan parameter koneksi). Server soket web memberi tahu klien bahwa ia akan menutup koneksi, karena token aksesnya tidak valid:
// (1) the server code emits
socket.emit('invalidAccessToken', function(data) {
console.log(data); // (4) server receives 'invalidAccessTokenEmitReceived' from client
socket.disconnect(true); // (5) force disconnect client
});
// (2) the client code listens to event
// client.on('invalidAccessToken', (name, fn) => {
// // (3) the client ack emits to server
// fn('invalidAccessTokenEmitReceived');
// });
Anda dapat melakukannya socket = undefined
dengan menghapus soket mana yang telah Anda sambungkan. Jadi ketika ingin terhubung lakukan socket (url)
Jadi akan terlihat seperti ini
const socketClient = require('socket.io-client');
let socket;
// Connect to server
socket = socketClient(url)
// When want to disconnect
socket = undefined;
Tambahkan koneksi soket baru ke array dan kemudian ketika Anda ingin menutup semua - loop melaluinya dan putuskan. (sisi server)
var socketlist = [];
io.sockets.on('connection', function (socket) {
socketlist.push(socket);
//...other code for connection here..
});
//close remote sockets
socketlist.forEach(function(socket) {
socket.disconnect();
});