Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确保NodeJS spawn stdout.on仅在换行符上激活_Java_Javascript_Node.js_Sockets_Socket.io - Fatal编程技术网

Java 确保NodeJS spawn stdout.on仅在换行符上激活

Java 确保NodeJS spawn stdout.on仅在换行符上激活,java,javascript,node.js,sockets,socket.io,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_pr

我使用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应该是这样的(有换行符):

但当我通过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开始)


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

您的
java.stdout
是一个位于Node.js中的可读取流
'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);
    });
});
var-app=require('express')();
var http=require('http')。服务器(应用程序);
var io=require('socket.io')(http);
app.get('/',函数(req,res){
res.sendFile(uu dirname+'/index.html');
var spawn=require('child_process')。spawn;
var java=spawn('java',['-jar',misc.jar']);
var lineBuffer=“”;
on('data',函数(data){
lineBuffer+=data.toString();
var lines=lineBuffer.split(“\n”);
对于(变量i=0;i
非常酷!我想说的是我要改变的一件事是
lineBuffer=lines[1]
相反,我可以让lineBuffer=除[0]之外的所有行th元素。不过我需要查找语法。我现在似乎有一个新问题。我将它附加到我的问题好的观点!我已更改代码,以考虑在一个数据事件中返回多行的情况。我建议一次发出所有可用行,并将最后一行放入缓冲区。这种情况是否仍然发生关于我在下面所做的更改?是的,很不幸。我想我会在周一重新开始工作时更多地使用它!啊,我想我明白了为什么它的某些部分会以奇数块的形式出现。这与从CDN下载socket.io的延迟有关。我在html中手动包含socket.io.js代码,并在开始时添加了垃圾代码走开!
0002
2 0003
3 0004
4 0005
5 0006
6 0007
7
0008
8 0009 
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);
    });
});