[英]Socket.IO handling disconnect event
無法處理這個斷開連接事件,不知道為什么socket沒有發送到客戶端/客戶端沒有響應!
服務器
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);
});
});
正如您所看到的,當客戶端斷開連接時,應該刪除 Array object[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
事件的邏輯,當套接字斷開連接時會觸發該邏輯,因此可以工作。
創建一個 Map 或一個 Set,並使用“on connection”事件設置給每個連接的套接字,反向“一旦斷開”事件從我們之前創建的 Map 中刪除該套接字
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)
})
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.