이 연결 끊기 이벤트를 처리 할 수 없습니다. 소켓이 클라이언트에 전송되지 않는 이유 / 클라이언트가 응답하지 않는 이유를 모릅니다!
섬기는 사람
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;
});
});
고객
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);
});
});
클라이언트가 연결을 끊을 때 알 수 있듯이 배열 객체 [person_name]는 삭제되어야하지만 삭제되지는 않습니다.
답변
좋아, 플레이어가 연결된 소켓이있는 이름 트랙으로 플레이어를 식별하는 대신. 다음과 같은 구현을 가질 수 있습니다.
섬기는 사람
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);
});
});
이것이 다른 방식으로 생각하는 데 도움이되기를 바랍니다.
답변
@ sha1과 같은 사람들이 왜 OP의 코드가 작동하지 않는지 궁금해합니다.
서버 측에서 플레이어를 삭제하는 OP 로직은 DelPlayer
이벤트 핸들러에 있으며,이 이벤트 ( DelPlayer
) 를 발생시키는 코드 disconnected
는 클라이언트의 이벤트 콜백 내부에 있습니다 .
이 disconnected
이벤트 를 발생시키는 서버 측 코드 disconnect
는 소켓 연결이 끊어 질 때 발생 하는 이벤트 콜백 내부에 있습니다. 소켓이 이미 연결이 끊어 졌으므로 disconnected
이벤트가 클라이언트에 도달하지 않습니다.
수락 된 솔루션은 disconnect
소켓이 연결 해제 될 때 실행되는 서버 측 에서 이벤트 로직을 실행 하므로 작동합니다.
답변
맵 또는 세트를 만들고 연결된 각 소켓에 설정된 “연결시”이벤트를 사용하여 역방향 “연결 해제”이벤트에서 이전에 만든 맵에서 해당 소켓을 삭제합니다.
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);
});
});
답변
또한 소켓 ID를 사용하여 이와 같이 플레이어 목록을 관리 할 수 있습니다.
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)
})
})