Soy bastante nuevo en node.js y me ha resultado bastante complicado separar un proyecto en varios archivos a medida que el proyecto crece de tamaño. Tenía un archivo grande antes del cual funcionaba como servidor de archivos y como servidor Socket.IO para un juego HTML5 multijugador. Lo ideal es separar el servidor de archivos, la lógica de socket.IO (leer la información de la red y escribirla en un búfer con una marca de tiempo y luego emitirla a todos los demás jugadores) y la lógica del juego.Separación del servidor de archivos y la lógica socket.io en node.js
Usando el primer ejemplo de socket.io para demostrar mi problema, normalmente hay dos archivos. app.js
es el servidor y index.html
se envía al cliente.
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>
Para servidor de archivos independiente y la lógica de servidor de juegos que necesitaría la función "manejador" se define en un archivo, necesitaría la función anónima usó una devolución de llamada para que io.sockets.on() estuviera en otro archivo, y necesitaría un tercer archivo para incluir ambos archivos correctamente. Por ahora he probado los siguientes:
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;
}
}
gameserver:
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);
}
}
Esto parece funcionar (la estática el contenido se sirve correctamente y la consola muestra claramente un apretón de manos con Socket.IO cuando el cliente se conecta) aunque no hay datos Alguna vez enviado Es como si nunca se llamaran realmente socket.emit() y socket.on(). Incluso modifiqué el controlador() en gameserver.js
para agregar console.log('User connected');
, pero esto nunca se muestra.
¿Cómo puedo tener Socket.IO en un archivo, un servidor de archivos en otro, y todavía espero que ambos funcionen correctamente?
¿conoces el marco express js? http://expressjs.com/ es genial y realmente te ayuda a estructurar tu aplicación. hay un montón de ejemplos en github (https://github.com/visionmedia/express/tree/master/examples) tal vez haya algo que pueda ayudarlo con su problema ... – pkyeck
@pkyeck: Estoy leyendo en Ahora me expreso para tratar de descubrir cómo puede beneficiarme, pero hasta ahora parece más complicado de lo que necesito. Todo lo que realmente quiero es separar mi lógica para el servidor del juego y el servidor de archivos en dos archivos separados, luego tengo un tercer archivo que inicia correctamente ambos servidores. – stevendesu
¿tuviste el tiempo de verificar mi "nueva" respuesta? – pkyeck