node.js에서 파일 서버와 socket.io 분리
저는 node.js를 처음 접하고 프로젝트 크기가 커짐에 따라 프로젝트를 여러 파일로 분리하는 것이 매우 복잡하다는 것을 알았습니다. 이전에는 멀티 플레이어 HTML5 게임을위한 파일 서버와 Socket.IO 역할을하는 대용량 파일이 하나 서버. 이상적으로는 모든 플레이어는 파일 서버, 소켓 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>
파일 서버와 게임 서버 필요를 분리하기 위해 하나의 파일에 정의 된 "handler"함수가 있습니다. 익명 함수는 io.sockets.on ()에 대한 복수를 사용하여 다른 파일에 있어야합니다. 세 번째 파일은이 두 파일을 모두 포함합니다. 지금은 다음을 시도했습니다.
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;
}
}
게임 서버 :
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
추가하기 위해 핸들러 ()를 수정 console.log('User connected');
했지만 여기서 표시되지 않습니다.
한 파일에 Socket.IO를, 다른 파일에 파일 서버를 두면서도 둘 다 작동 할 기대하는 방법은 무엇입니까?
socket.io 0.8에서는 io.sockets.on('...')
네임 스페이스를 사용하지 않는 한를 사용하여 이벤트를 첨부해야합니다 sockets
.
io.listen(fileserver).sockets.on('connection', handler)
그런 식으로 연결하지 않는 것이 좋습니다 ( io
나중에 개체 를 사용할 수 있음 ). 지금 내가하는 방식 :
// sockets.js
var socketio = require('socket.io')
module.exports.listen = function(app){
io = socketio.listen(app)
users = io.of('/users')
users.on('connection', function(socket){
socket.on ...
})
return io
}
그런 다음 서버를 만든 후 app
:
// main.js
var io = require('./lib/sockets').listen(app)
나는 이와 같은 것을 할 것입니다.
app.js
var app = require('http').createServer(handler),
sockets = require('./sockets'),
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);
});
}
sockets.startSocketServer(app);
app.listen(80);
및 sockets.js
var socketio = require('socket.io'),
io, clients = {};
module.exports = {
startSocketServer: function (app) {
io = socketio.listen(app);
// configure
io.configure('development', function () {
//io.set('transports', ['websocket', 'xhr-polling']);
//io.enable('log');
});
io.configure('production', function () {
io.enable('browser client minification'); // send minified client
io.enable('browser client etag'); // apply etag caching logic based on version number
io.set('log level', 1); // reduce logging
io.set('transports', [ // enable all transports (optional if you want flashsocket)
'websocket'
, 'flashsocket'
, 'htmlfile'
, 'xhr-polling'
, 'jsonp-polling'
]);
});
//
io.sockets.on('connection', function (socket) {
console.log("new connection: " + socket.id);
socket.on('disconnect', function () {
console.log("device disconnected");
});
socket.on('connect_device', function (data, fn) {
console.log("data from connected device: " + data);
for (var col in data) {
console.log(col + " => " + data[col]);
}
});
});
}
};
방금 내 오래된 코드 중 일부를 복사하여 삭제했습니다. socket.io의 마지막 버전에서 무엇이 변경되었는지는 모르겠지만 실제 코드보다 구조에 관한 것입니다.
그리고 나는 당신의 목적을 위해 단지 2 개의 개의 파일을 사용할 수 있습니다. 3. 당신이 그것을 더 나눌 것을 생각할 때, 아마도 다른 경로에 대해 하나의 다른 파일을 사용할 것입니다.
도움이 되셨기를 바랍니다.
나는 이것에도 균열이 있었고 결과에 상당히 만족합니다. https://github.com/hackify/hackify-server 에서 소스 코드를 확인하십시오 .
다른 해결책이 있습니다. require.js를 사용하여 모듈을 만들고 "app"을 인수로 전달할 수 있습니다. 모듈 내에서 socket.io를 시작하고 소켓을 구성 할 수 있습니다.
app.js :
var requirejs = require('requirejs');
requirejs.config({
baseUrl: './',
nodeRequire: require
});
requirejs(['sockets'], function(sockets) {
var app = require('http').createServer()
, fs = require('fs')
, io = sockets(app);
// do something
// add more sockets here using "io" resource
});
당신에 socket.js 이 같은 일을 할 수있는 모듈 :
define(['socket.io'], function(socket){
return function(app){
var server = app.listen(3000)
, io = socket.listen(server);
io.sockets.on('connection', function (socket) {
console.log('connected to socket');
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
// more more more
});
return io;
}
});
제 공헌에 도움이되기를 바랍니다.
참고 URL : https://stackoverflow.com/questions/9709912/separating-file-server-and-socket-io-logic-in-node-js
'ProgramingTip' 카테고리의 다른 글
메시지와 포스트 메시지의 차이점은 무엇이며 C #, WPF 및 Pure Windows 프로그래밍과 어떤 관련이입니까? (0) | 2020.11.05 |
---|---|
Firefox 4 onBeforeUnload 사용자 지정 메시지 (0) | 2020.11.05 |
git 파일을 스테이징 영역 버전으로 되돌리려면 어떻게해야합니까? (0) | 2020.11.05 |
Write-Host와 Write-Output의 PowerShell 차이점은 무엇입니까? (0) | 2020.11.05 |
한 문서에서 다른 문서로 조건부 서식을 비용 지불해야합니까? (0) | 2020.11.05 |