J'écris le code du serveur pour un petit jeu, et après plusieurs tests, j'obtiens cette erreur Maximum call stack size exceeded
.La pile d'appels maximale a été dépassée, sans aucune récursion.
La logique est vraiment simple. Chaque instance du jeu nécessite 2 joueurs. Lorsqu'un joueur visite le serveur localhost
, il est présenté avec 2 choix: host
et join
. Dans le code côté serveur, il y a un objet javascript qui garde une trace des jeux disponibles. Lorsqu'un utilisateur sélectionne jointure, le serveur émet les données à l'intérieur de l'objet et chaque jeu disponible est présenté à l'utilisateur sous la forme d'un bouton.
La structure de l'objet est le suivant (pour 2 jeux en cours d'exécution):
var games = {
game_IDs : [],
socketIDOfHost1: {
"player1": socketOfPlayer1,
"player2": socketOfPlayer2
},
socketIDOfHost2: {
"player1": socketOfPlayer1,
"player2": socketOfPlayer2
}
}
Le code est le suivant:
Serveur:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
var games = {
game_IDs: []
};
io.on('connection', function (socket) {
socket.on('join', function (data) {
socket.emit('join-data', games);
});
socket.on('host', function() {
games.game_IDs.push(socket.id);
games[socket.id] = {};
games[socket.id]["player1"] = socket.id;
socket.emit('host-data', socket.id);
});
socket.on('game-select', function (data) {
games[data]["player2"] = socket;
games[socket.id] = games[data];
});
});
http.listen(4000, function() {
});
Client:
var socket = io();
function host() {
document.getElementById("container").style.visibility = "visible";
socket.emit('host', socket.id);
}
function join(){
document.getElementById("container").style.visibility = "visible";
socket.emit('join', "kappapride");
}
function selectGame(id) {
socket.emit('game-select', id);
}
socket.on('host-data', function (data) {
let e = document.getElementById("container");
let p1 = document.createElement("div");
p1.innerHTML = "<h1>Player1: " + data + "</h1>";
p1.style.width = "100%";
e.appendChild(p1);
});
socket.on('join-data', function (data) {
let e = document.getElementById("container");
for(let i=0; i<data.game_IDs.length; i++){
let game = document.createElement("button");
game.innerHTML = data.game_IDs[i];
game.addEventListener("click", function() {
selectGame(this.innerHTML);
});
game.style.position = "absolute";
game.style.width = "100%";
game.style.height = "50px";
game.style.backgroundColor = i%2==0? "aqua": "aliceblue";
e.appendChild(game);
}
});
Si j'ouvre 2 ins tances du navigateur, host
avec l'un d'eux, et join
avec l'autre, tout fonctionne comme prévu, le jeu est trouvé et affiché comme un bouton. Si j'ouvre 3 instances, host
avec deux d'entre eux, et join
avec le dernier, j'obtiens cette erreur. C'est clairement un problème de mémoire, mais le plan est de le faire fonctionner, avec éventuellement plus de 2 instances du jeu fonctionnant simoultanément. Y a-t-il quelque chose que je puisse faire? Est-ce que je regarde cela de la mauvaise façon?
Où obtenez-vous cette erreur, sur le serveur, le premier client ou le second client? – Bergi
Obtenez-vous le 'RangeError: la taille maximale de la pile d'appels a été dépassée? – kemotoe
@kemotoe Oui exactement – VlassisFo