Je suis assez novice en matière de node.js et j'ai constaté qu'il est assez compliqué de séparer un projet en plusieurs fichiers au fur et à mesure que la taille du projet augmente. Avant, j'avais un gros fichier qui servait à la fois de serveur de fichiers et de serveur Socket.IO pour un jeu HTML5 multi-joueurs. Idéalement, je veux séparer le serveur de fichiers, la logique Socket.IO (lire des informations sur le réseau et les écrire dans un tampon avec un horodatage, puis les transmettre à tous les autres joueurs), et la logique du jeu.
En utilisant le premier exemple de socket.io pour démontrer mon problème, il y a deux fichiers normalement. app.js
est le serveur et index.html
est envoyé au client.
app.js :
var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs')
app.listen(80);
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
index.html :
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
Pour séparer la logique du serveur de fichiers de celle du serveur de jeu, il faudrait que la fonction "handler" soit définie dans un fichier, que la fonction anonyme utilisée comme callback pour io.sockets.on() soit dans un autre fichier, et qu'un troisième fichier soit inclus avec succès dans ces deux fichiers. Pour l'instant, j'ai essayé ce qui suit :
start.js :
var fileserver = require('./fileserver.js').start()
, gameserver = require('./gameserver.js').start(fileserver);
fileserver.js :
var app = require('http').createServer(handler),
fs = require('fs');
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
module.exports = {
start: function() {
app.listen(80);
return app;
}
}
serveur de jeux :
var io = require('socket.io');
function handler(socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
}
module.exports = {
start: function(fileserver) {
io.listen(fileserver).on('connection', handler);
}
}
Cela semble fonctionner (le contenu statique est correctement servi et la console montre clairement une poignée de main avec Socket.IO lorsque le client se connecte) mais aucune donnée n'est jamais envoyée. C'est comme si socket.emit() et socket.on() n'étaient jamais appelés. J'ai même modifié handler() dans gameserver.js
à ajouter console.log('User connected');
mais il n'est jamais affiché.
Comment puis-je avoir Socket.IO dans un fichier, un serveur de fichiers dans un autre, et m'attendre à ce que les deux fonctionnent correctement ?
4 votes
Connaissez-vous le framework express js ? expressjs.com il est génial et vous aide vraiment à structurer votre application. il y a une tonne d'exemples sur github ( github.com/visionmedia/express/tree/master/examples ) peut-être qu'il y a quelque chose qui peut vous aider avec votre problème...
1 votes
@pkyeck : Je suis en train de lire sur expressjs pour essayer de comprendre comment il peut m'être utile, mais jusqu'à présent il semble plus compliqué que ce dont j'ai besoin. Tout ce que je veux vraiment, c'est séparer ma logique pour le serveur de jeux et le serveur de fichiers en deux fichiers distincts, puis avoir un troisième fichier qui démarre correctement les deux serveurs.
0 votes
Avez-vous eu le temps de vérifier ma "nouvelle" réponse ?
0 votes
@pkyeck J'y ai jeté un coup d'œil, mais j'ai l'impression que cela ne fait que masquer le problème sans le résoudre. Ce n'est pas sockets.js qui est l'UNIQUE FICHIER MASSIF à la place de app.js. J'aimerais ne pas avoir de fichiers uniques et massifs mais plutôt des fichiers séparés pour chaque fonction. De plus en plus, node.js semble être plus un problème qu'une bénédiction.