【发布时间】:2012-03-31 09:09:19
【问题描述】:
我对 node.js 还很陌生,我发现随着项目规模的扩大,将一个项目分成多个文件非常复杂。我有一个大文件,之前它既用作文件服务器,又用作多人 HTML5 游戏的 Socket.IO 服务器。理想情况下,我希望将文件服务器、socket.IO 逻辑(从网络读取信息并将其写入带有时间戳的缓冲区,然后将其发送给所有其他玩家)和游戏逻辑。
使用socket.io中的第一个示例来演示我的问题,通常有两个文件。 app.js 是服务器,index.html 被发送到客户端。
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>
为了分离文件服务器和游戏服务器逻辑,我需要在一个文件中定义函数“处理程序”,我需要使用 io.sockets.on() 回调的匿名函数在另一个文件中,我会还需要第三个文件才能成功包含这两个文件。现在我尝试了以下方法:
start.js:
var fileserver = require('./fileserver.js').start()
, gameserver = require('./gameserver.js').start(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;
}
}
游戏服务器:
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);
}
}
这似乎有效(静态内容已正确提供,并且在客户端连接时控制台清楚地显示了与 Socket.IO 的握手),尽管从未发送过任何数据。就好像 socket.emit() 和 socket.on() 从来没有真正被调用过。我什至修改了 gameserver.js 中的 handler() 以添加 console.log('User connected'); 但这从未显示。
我怎样才能在一个文件中拥有 Socket.IO,在另一个文件中拥有文件服务器,并且仍然期望两者都能正常运行?
【问题讨论】:
-
你知道express js框架吗? expressjs.com 这很棒,真的可以帮助您构建应用程序。 github 上有大量示例 (github.com/visionmedia/express/tree/master/examples) 也许有一些东西可以帮助您解决问题...
-
@pkyeck:我现在正在阅读 expressjs,试图弄清楚它如何使我受益,但到目前为止,它似乎比我需要的要复杂。我真正想要的只是将游戏服务器和文件服务器的逻辑分成两个单独的文件,然后有第三个文件可以正确启动两个服务器。
-
您有时间查看我的“新”答案吗?
-
@pkyeck 我看过它,虽然它似乎只是掩盖了问题而不是解决它。不是 sockets.js 是 ONE MASSIVE FILE 而不是 app.js。我不想有一个单一的大文件,而是为每个功能单独的文件。越来越多的 node.js 看起来更像是一件麻烦事而不是祝福。