Tôi khá mới đối với node.js và tôi đã tìm thấy việc tách một dự án thành nhiều tệp phức tạp khi dự án phát triển về kích thước. Tôi đã có một tệp lớn trước đó phục vụ như một máy chủ tệp và máy chủ Socket.IO cho trò chơi HTML5 nhiều người chơi. Tôi lý tưởng muốn tách máy chủ tập tin, logic socket.IO (đọc thông tin từ mạng và ghi nó vào một bộ đệm với một dấu thời gian, sau đó phát ra nó cho tất cả người chơi khác), và logic trò chơi.Tách logic máy chủ tệp và socket.io trong node.js
Sử dụng ví dụ đầu tiên từ socket.io để minh họa sự cố của tôi, có hai tệp bình thường. app.js
là máy chủ và index.html
được gửi cho khách hàng.
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>
Để máy chủ tập tin riêng biệt và logic trò chơi máy chủ tôi sẽ cần các chức năng "xử lý" được định nghĩa trong một tập tin, tôi sẽ cần chức năng ẩn danh đã sử dụng gọi lại cho io.sockets.on() để ở trong một tệp khác và tôi sẽ cần một tệp thứ ba để bao gồm thành công cả hai tệp này. Để bây giờ tôi đã thử như sau:
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);
}
}
Điều này dường như làm việc (các tĩnh nội dung được phục vụ đúng cách và giao diện điều khiển hiển thị rõ ràng một cái bắt tay với Socket.IO khi khách hàng kết nối) mặc dù không có dữ liệu đã từng gửi. Nó giống như socket.emit() và socket.on() chưa bao giờ được gọi. Tôi thậm chí đã sửa đổi handler() trong số gameserver.js
để thêm console.log('User connected');
tuy nhiên điều này không bao giờ được hiển thị.
Làm cách nào để có Socket.IO trong một tệp, máy chủ tệp ở một tệp khác và vẫn mong cả hai hoạt động chính xác?
bạn có biết khung công tác js nhanh không? http://expressjs.com/ thật tuyệt vời và thực sự giúp bạn cấu trúc ứng dụng của mình. có rất nhiều ví dụ về github (https://github.com/visionmedia/express/tree/master/examples) có thể có điều gì đó có thể giúp bạn giải quyết vấn đề của mình ... – pkyeck
@pkyeck: Tôi đang đọc bây giờ tôi đã cố gắng và tìm ra cách nó có thể mang lại lợi ích cho tôi, nhưng cho đến nay nó có vẻ phức tạp hơn những gì tôi cần. Tất cả những gì tôi thực sự muốn là phân tách logic của mình cho máy chủ trò chơi và máy chủ tệp thành hai tệp riêng biệt sau đó có tệp thứ ba khởi động đúng cả hai máy chủ. – stevendesu
bạn có thời gian để kiểm tra câu trả lời "mới" của tôi không? – pkyeck