12

websocket を使用してブラウザへのデータ ストリームを作成しようとしています。データはログ ファイルの出力です。(tail -f filename) node js を使用して stdout にログインできましたが、サーバーを作成してクライアント (js/html) コードを作成し、websocket を作成してすべての出力を受け取ることができませんでした。この子プロセス。誰でも私を助けることができますか?

NODE.JS SERVER OUTPUTTING TAIL TO 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);
});

私の目標は、可能な限り単純なストリームを作成することです。これについては、他の単純なソリューションが好評です。ありがとう。

4

3 に答える 3

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、ロング ポール、フラッシュなど) を使用するためです。クライアントの JavaScript の例が必要な場合は、それも投稿できます。

于 2010-09-05T14:56:39.167 に答える
7

これは、この要点から主に取得した簡単なサンプルです

まず、空のディレクトリに切り替えます

mkdir socket-tail-app; cd socket-tail-app;

次に、必要なものをインストールします

npm install socket.io               

このように実行します

node server.js /path/to/file/to/tail

実行後、ブラウザを開きます

http://localhost:8000

必要なファイルは次のとおりです。

サーバー.js

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');

index.html

<!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>
于 2015-12-18T20:35:04.627 に答える
7

これは古い質問のようで、問題はすでに解決されている可能性が非常に高いですが、そうでない場合は要点https://gist.github.com/867575があります。

socket.io を使用し、"tail -f" プロセス (より多くのメモリを消費する) を生成する代わりに、fs.watchFile が使用されます。

于 2011-03-13T01:23:41.307 に答える