Node.js рдФрд░ WebSocket рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд▓реЙрдЧ рдХрд╛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рджрд░реНрд╢рди
рдХрднреА-рдХрднреА рдХреБрдЫ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ рдирдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЙрджреНрднрд╡ рдХреА рдЧрддрд┐рд╢реАрд▓ рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рд░рд▓реАрдХреГрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде, рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдФрд░ рдореЙрдбреНрдпреВрд▓
Node.js. рдХреЛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд░реВрдмрд▓ рдореЗрдВ рдИрдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
рд╕реЙрдХреЗрдЯ.рдЖрдИрдУрдЖрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд░рд┐рд╢реНрд╡рдд рджреА рдЧрдИ, рд╕рд╛рде рд╣реА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рд░рд▓ рдореЙрдбреНрдпреВрд▓ред
рдиреЛрдб рд╡реГрдХреНрд╖реЛрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдкреЗрдбрд╝ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдБ - рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдЙрдкрд╕реНрдерд┐рддрд┐, рд╡рд┐рд▓реЛрдкрди, рд╕рд╛рде рд╣реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╣реИред
рдЖрдо.NODES_PATH рдХреЗ рдЕрдВрджрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ / рд╡рд┐рд▓реЛрдкрди рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдФрд░ рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред
watch.createMonitor(common.NODES_PATH, function (monitor) { monitor.on("created", function (f, stat) { var file_name = common.removeRoot(f); console.log(file_name + ' created'); var idx = log_files.indexOf(file_name); if (idx < 0) { log_files.push(file_name); io.sockets.emit('log_files_add', [file_name]); watchFile(file_name); } }) monitor.on("removed", function (f, stat) { var file_name = common.removeRoot(f); console.log(file_name + ' removed'); var idx = log_files.indexOf(file_name); if (idx >= 0) { log_files.splice(idx, 1); io.sockets.emit('log_files_remove', [file_name]); unwatchFile(file_name); } }) })
рдПрдХ рдиреЛрдбрдЬ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╡реЙрдХрд░ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░реВрдиреА рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рдЪрд▓рдиреЗ рдФрд░ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╛, рдЕрдЧрд░ рд╕рд░рд▓реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рд╕рднреА рд╕рдмрдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реИред (рдиреАрдЪреЗ рдЙрджрд╛рд╣рд░рдг)
рдЬреЗрдб - рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди - рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рд╕рд░рд▓ рдпреВрдЖрдИ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрджрд╛рд╣рд░рдг
- рд╣рдо рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреЛрд░реНрдЯ рдкрд░ рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдмрдирд╛рддреЗ рд╣реИрдВ;
- рдкрд╣рд▓реА рдмрд╛рд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╡реЙрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдореМрдЬреВрджрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ (рд╡рд┐рд╕реНрддрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд▓рд╕ рдлрд╝рд┐рд▓реНрдЯрд░) рдФрд░ рдЕрдВрддрд┐рдо 20 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднрд╛рдЧ рднреЗрдЬрддреЗ рд╣реИрдВред
io.sockets.on('connection', function(socket) { var walk = require('walk');
- рдШрдбрд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдПрдХ рдореЙрдирд┐рдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдирдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдпрд╛ рд╡рд┐рд▓реЛрдкрди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдЧрд╛ред (рдЬрдм рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рджрд┐рдП рдЧрдП рд▓реЙрдЧ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдмреНрд▓реЙрдХ рддрджрдиреБрд╕рд╛рд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)
function watchFile(file) { console.log('start watching: ' + file); var tail = spawn('tail', ['-f'].concat(common.NODES_PATH + '/' + file)); watching_processes[file] = tail; tail.stdout.on('data', function(data) { console.log('emit ' + file + ':lines' + ' with ' + data.toString('utf-8')); io.sockets.emit(file + ':lines', data.toString('utf-8').split('\n')); }) } function unwatchFile(file) { console.log('end watching: ' + file); var process = watching_processes[file]; process.kill(); watching_processes[file] = null; }
рд▓рд╛рдВрдЪ
рд╕рд╛рдорд╛рдиреНрдп.рдЬреЗрдПрд╕ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдЬрд┐рд╕реЗ рдореЙрдирд┐рдЯрд░ рдХрд░рдирд╛ рд╣реИ
var NODES_PATH = pathResolver.resolve(__dirname + '/../nodes');
рдЬрдм * .log рдлрд╝реЛрд▓реНрдбрд░ рдФрд░ рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
npm install
рд╕рдВрдХреБрд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд
npm install
рд▓рд┐рдП рд╕рдВрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
[~/Projects/autotest_node] git:master $ mkdir nodes
[~/Projects/autotest_node] git:master $ mkdir nodes/test1
[~/Projects/autotest_node] git:master $ mkdir nodes/test2
[~/Projects/autotest_node] git:master $ echo "test_message1" >> nodes/test1/first.log
[~/Projects/autotest_node] git:master $ echo "test_message1" >> nodes/test2/first.log
[~/Projects/autotest_node] git:master $ echo "test_message2" >> nodes/test2/first.log
[~/Projects/autotest_node] git:master $ echo "test_message2" >> nodes/test1/first.log
npm start
рд╕рд░реНрд╡рд░
npm start
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ

рд╕реНрд░реЛрдд рдХреЛрдб
https://github.com/catz/autotest_nodeрдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЛ рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдЙрдкрдХрд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдкреВрдВрдЫ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред