确保NodeJS生成stdout.on仅在换行符上激活

时间:2015-03-22 21:14:57

标签: java javascript node.js sockets socket.io

我使用spawn功能通过NodeJS运行外部程序,如下所示:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);


app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');

  var spawn = require('child_process').spawn;
  var java = spawn('java', ['-jar', 'misc.jar']);
  java.stdout.on('data', function(data) {
      console.log(data.toString());
      io.emit('chat message', data.toString())
  });

});

预期的stdout应该是这样的(使用新行):

>java -jar misc.jar
0000
0
0001
1
...

但是当我通过NodeJS / Socket.io运行它时,我得到:

listening on *:3000
000
0
0

000
1
1
...

我想确保只有当数据是换行符或退出子流程时才会调用java.stdout.on('data', function(data){...

在将data调用java.stdout.on('data', function(data) {...时,Socket.io/NodeJS似乎还有其他一些模式。

我如何确保这一点?

更新: 好了,现在我似乎有了以下代码的新行:

  var lineBuffer = "";
  java.stdout.on('data', function(data) {  
      lineBuffer += data.toString();
      var lines = lineBuffer.split("\n");

      if (lines.length > 1) {
          var line = lines[0];
          console.log(line);
          io.emit('chat message', line);
          lineBuffer = lines[1];
      }
  });

但是,我看到了一个新问题。 console.log(line)显示的文本与emit(line)命令不同:

listening on *:3000
0000
0
0001
1
...

VS。 (注意它甚至不是从0001开始)

0002
2 0003
3 0004
4 0005
5 0006
6 0007
7
0008
8 0009 

来自io.emit(...)命令的内容。因此console.log(...)显示正确的数据,但socket.io.emit不是!

1 个答案:

答案 0 :(得分:4)

您的java.stdout在Node.js中是Readable Stream。可读流'data'事件只是在它们进入时返回数据块,无论新行字符在哪里。

如果您只想在有换行符时发出消息,则必须自己实现该逻辑。试试这个:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res) {

    res.sendFile(__dirname + '/index.html');

    var spawn = require('child_process').spawn;
    var java = spawn('java', ['-jar', 'misc.jar']);

    var lineBuffer = "";

    java.stdout.on('data', function(data) {

        lineBuffer += data.toString();

        var lines = lineBuffer.split("\n");

        for (var i = 0; i < lines.length - 1; i++) {

            var line = lines[i];

            console.log(line);
            io.emit('chat message', line);
        }

        lineBuffer = lines[lines.length - 1];
    });

    java.stdout.on('end', function() {

        console.log(lineBuffer);
        io.emit('chat message', lineBuffer);
    });
});