我使用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
不是!
答案 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);
});
});