Tidak dapat menangani peristiwa pemutusan hubungan ini, tidak tahu mengapa soket tidak dikirim ke klien / klien tidak merespons!
Server
io.sockets.on('connection', function (socket) {
socket.on('NewPlayer', function(data1) {
online = online + 1;
console.log('Online players : ' + online);
console.log('New player connected : ' + data1);
Players[data1] = data1;
console.log(Players);
});
socket.on('DelPlayer', function(data) {
delete Players[data];
console.log(Players);
console.log('Adios' + data);
});
socket.on('disconnect', function () {
socket.emit('disconnected');
online = online - 1;
});
});
Klien
var socket = io.connect('http://localhost');
socket.on('connect', function () {
person_name = prompt("Welcome. Please enter your name");
socket.emit('NewPlayer', person_name);
socket.on('disconnected', function() {
socket.emit('DelPlayer', person_name);
});
});
Seperti yang Anda lihat ketika klien memutuskan hubungan, objek Array [person_name] harus dihapus, tetapi tidak
javascript
socket.io
disconnect
Raggaer
sumber
sumber
'disconnect'
bukan'disconnected'
?Jawaban:
Oke, alih-alih mengidentifikasi pemain dengan jalur nama dengan soket yang mereka hubungkan. Anda dapat memiliki implementasi seperti
Server
var allClients = []; io.sockets.on('connection', function(socket) { allClients.push(socket); socket.on('disconnect', function() { console.log('Got disconnect!'); var i = allClients.indexOf(socket); allClients.splice(i, 1); }); });
Semoga ini akan membantu Anda untuk berpikir dengan cara lain
sumber
allClients.splice(i, 1)
untuk menghapus elemen.delete allClients[i]
hanya akan mengatur posisi array keundefined
i
mendapat nilai -1 setiap kali. Bisakah Anda memberi tahu saya apa yang sedang terjadi.allClients
larik Anda ). Saya sarankan Anda kembali:if (i === -1)return;
sebelum mencoba menyambungkannya.Bagi mereka seperti @ sha1 yang bertanya-tanya mengapa kode OP tidak berfungsi -
Logika OP untuk menghapus pemain di sisi server ada di handler untuk
DelPlayer
acara, dan kode yang mengeluarkan acara ini (DelPlayer
) ada di dalamdisconnected
acara callback klien.Kode sisi server yang memancarkan
disconnected
peristiwa ini ada di dalamdisconnect
peristiwa callback yang dipicu saat soket kehilangan koneksi. Karena soket sudah kehilangan koneksi,disconnected
acara tidak mencapai klien.Solusi yang diterima mengeksekusi logika pada
disconnect
acara di sisi server, yang ditembakkan ketika soket terputus, karenanya berfungsi.sumber
Buat Peta atau Set, dan gunakan acara "on connection" yang disetel untuk itu setiap soket yang terhubung, sebaliknya acara "sekali putuskan" hapus soket itu dari Peta yang kita buat sebelumnya
import * as Server from 'socket.io'; const io = Server(); io.listen(3000); const connections = new Set(); io.on('connection', function (s) { connections.add(s); s.once('disconnect', function () { connections.delete(s); }); });
sumber
Anda juga bisa, jika Anda suka menggunakan id soket untuk mengelola daftar pemain Anda seperti ini.
io.on('connection', function(socket){ socket.on('disconnect', function() { console.log("disconnect") for(var i = 0; i < onlineplayers.length; i++ ){ if(onlineplayers[i].socket === socket.id){ console.log(onlineplayers[i].code + " just disconnected") onlineplayers.splice(i, 1) } } io.emit('players', onlineplayers) }) socket.on('lobby_join', function(player) { if(player.available === false) return var exists = false for(var i = 0; i < onlineplayers.length; i++ ){ if(onlineplayers[i].code === player.code){ exists = true } } if(exists === false){ onlineplayers.push({ code: player.code, socket:socket.id }) } io.emit('players', onlineplayers) }) socket.on('lobby_leave', function(player) { var exists = false for(var i = 0; i < onlineplayers.length; i++ ){ if(onlineplayers[i].code === player.code){ onlineplayers.splice(i, 1) } } io.emit('players', onlineplayers) }) })
sumber