Ich bin ziemlich neu in node.js und habe festgestellt, dass es ziemlich kompliziert ist, ein Projekt in mehrere Dateien zu unterteilen, wenn das Projekt größer wird. Ich hatte eine große Datei, die sowohl als Dateiserver als auch als Socket.IO-Server für ein Multiplayer-HTML5-Spiel diente. Ich möchte im Idealfall den Dateiserver, die Socket.IO-Logik (Lesen von Informationen aus dem Netzwerk und Schreiben in einen Puffer mit einem Zeitstempel, dann an alle anderen Spieler senden) und die Spielelogik trennen.
Anhand des ersten Beispiels aus socket.io, um mein Problem zu demonstrieren, gibt es normalerweise zwei Dateien. app.js
ist der Server und index.html
wird an den Client gesendet.
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>
Um die Logik von Dateiserver und Spielserver zu trennen, müsste die in einer Datei definierte Funktion "Handler" verwendet werden. Die anonyme Funktion würde einen Rückruf für io.sockets.on () verwenden, um in einer anderen Datei zu sein, und ich würde noch eine benötigen dritte Datei, um diese beiden Dateien erfolgreich einzuschließen. Im Moment habe ich Folgendes versucht:
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;
}
}
Spieleserver:
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);
}
}
Dies scheint zu funktionieren (der statische Inhalt wird ordnungsgemäß bereitgestellt und die Konsole zeigt deutlich einen Handshake mit Socket.IO an, wenn der Client eine Verbindung herstellt), obwohl niemals Daten gesendet werden. Es ist, als würden socket.emit () und socket.on () niemals aufgerufen. Ich habe sogar handler () geändert, gameserver.js
um hinzuzufügen, console.log('User connected');
aber dies wird nie angezeigt.
Wie kann ich Socket.IO in einer Datei und einen Dateiserver in einer anderen Datei haben und trotzdem erwarten, dass beide ordnungsgemäß funktionieren?