我正在尝试使用websocket创建一个数据流到浏览器。数据是日志文件的输出。 (tail -f filename) 使用节点js,我已经设法登录到stdout,但我无法创建服务器并创建客户端(js / html)代码来创建websocket并接收此子进程的所有输出。 任何人都可以帮助我吗?
NODE.JS服务器输出TAIL到STDOUT(如http://snippets.dzone.com/posts/show/12067所示)
var sys = require('sys')
var spawn = require('child_process').spawn;
var filename = process.ARGV[2];
if (!filename)
return sys.puts("Usage: node <server.js> <filename>");
var tail = spawn("tail", ["-f", filename]);
sys.puts("start tailing");
tail.stdout.on("data", function (data) {
sys.puts(data);
});
我的目标是让最简单的流可能。任何其他简单的解决方案都很受欢迎。感谢。
答案 0 :(得分:16)
这很简单吗?
var sys = require('sys')
var spawn = require('child_process').spawn;
var filename = process.ARGV[2];
if (!filename)
return sys.puts("Usage: node <server.js> <filename>");
var tail = spawn("tail", ["-f", filename]);
http = require('http');
http.createServer(function (req, res) {
sys.puts("new connection..");
res.writeHead(200, {'Content-Type': "text/plain;charset=UTF-8"});
tail.stdout.on("data", function (data) {
res.write(data);
});
}).listen(3000);
连接到服务器,你会得到你的尾巴。如果尾部空闲,您将需要在客户端监视超时,具体取决于您的浏览器。
如果您想在浏览器中从javascript访问此数据,请考虑使用socket.io,因为这将使用浏览器可用的最佳方法来访问流(websocket,long poll,flash等)。如果你需要一个客户端javascript示例,我也可以发布它。
答案 1 :(得分:7)
这似乎是一个古老的问题&amp;问题很可能已经解决了, 但是如果它不在这里是一个要点https://gist.github.com/867575。
它使用socket.io 而不是产生“tail -f”进程(需要更多内存),而是使用fs.watchFile。
答案 2 :(得分:5)
这是一个我主要从this gist
抓取的简单示例mkdir socket-tail-app; cd socket-tail-app;
npm install socket.io
node server.js /path/to/file/to/tail
http://localhost:8000
var http = require('http'),
io = require('socket.io'),
fs = require('fs');
var spawn = require('child_process').spawn;
var filename = process.argv[2];
if (!filename)
{
console.log("Usage: node server.js filename_to_tail");
return;
}
// -- Node.js Server ----------------------------------------------------------
server = http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/html'})
fs.readFile(__dirname + '/index.html', function(err, data){
res.write(data, 'utf8');
res.end();
});
})
server.listen(8000, '0.0.0.0');
// -- Setup Socket.IO ---------------------------------------------------------
var io = io.listen(server);
io.on('connection', function(client){
console.log('Client connected');
var tail = spawn("tail", ["-f", filename]);
client.send( { filename : filename } );
tail.stdout.on("data", function (data) {
console.log(data.toString('utf-8'))
client.send( { tail : data.toString('utf-8') } )
});
});
console.log('Server running at http://0.0.0.0:8000/, connect with a browser to see tail output');
<!DOCTYPE html>
<html>
<head>
<title>tail.js</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="//cdn.socket.io/socket.io-1.3.7.js"></script>
<style>
body
{ color: #1a2c37;
font-family: 'Helvetica', sans-serif; font-size: 86%;
padding: 2em; }
#info
{ font-size: 120%;
font-weight: bold; }
#tail
{ border: 1px solid #ccc;
height: 300px;
padding: 0.5em;
overflow: hidden;
position: relative;
overflow-y: scroll; }
</style>
</head>
<body>
<pre id="info"></pre>
<pre id="tail"></pre>
<script>
var Application = function() {
var socket = io.connect('http://127.0.0.1:8000/');
socket.on('connect', function() {
console.log('Connected to:', socket.host);
});
socket.on('message', function(message) {
console.log('Received message:', message);
if (message.filename) {
$('#info').html( '$ tail -f ' + message.filename );
};
if (message.tail) {
$('#tail').html( $('#tail').html() + message.tail );
bottom = $("#tail")[0].scrollHeight - $("#tail").height()
$('#tail').scrollTop(bottom);
}
});
return {
socket : socket
};
};
$(function() { var app = Application(); });
</script>
</body>
</html>