在Qt Application和nodejs服务器

时间:2018-04-02 08:13:12

标签: node.js qt stdout stdin qprocess

我在nodejs中创建了一个Web服务器体系结构,它在运行时提供网页。 另一方面,我有一个Qt GUI应用程序。 我需要在这两者之间建立一个接口。 我已经使用QProcess创建了这两者之间的连接(服务器现在从这个Qt应用程序启动) 现在我想在它们之间交换一些数据,例如从GUI返回的网页上的随机消息。 stdin /没有任何用处吗? 你能指导我一下吗?这是我的服务器代码:

 `function init() {

var __website = path.join(__dirname, 'Website/');
var __css = path.join(__dirname, 'css/');

app.use(bodyParser.json());
app.use(express.static(path.join(__website)));
app.get('/', function (req, res, next) {
    res.render('index', function (err, html) {
        res.send(html);
    });
});
app.get('/data/:iValue', function( req, res) {
process.stdin.on('readable', function() {
  var chunk = process.stdin.read();
  if (chunk != null) {
    res.json({response: chunk.toString("UTF-8")});
     }
 });
   process.stdout.write('request_data:' + temperature);

});
}
function initSocket() {
var Session = require('express-session');
var MemoryStore = require('session-memory-store')(Session);
var session = new Session({
 store: new MemoryStore(),
 secret: 'supersecret',
 resave: true,
 saveUninitialized: true
})

//io = require('socket.io')(https);
io = new ioServer();
io.use(ios(session));
// In-memory storage
// Begin listening for a websockets connection
io.on('connection', function (socket) {
    socket.emit('setRange', data.min, data.max);
    socket.emit('setEmails', data.emails);
    setInterval(function () {
    var temperature;
        //var temperature = Math.floor((Math.random() * 20) + 15);
        socket.emit('updateTemperature', {
            temperature: temperature
        });
        if (temperature < data.min || temperature > data.max) {
            // console.log('alert! ' + temperature + ' min:' + data.min + ' 
max:' + data.max)
            sendEmail(temperature);
            socket.emit('alert', {
                temperature: temperature,
                message: 'Temp is outside of Value Range'
            });
        }
    }, 2000);`

2 个答案:

答案 0 :(得分:0)

我认为您不必将服务器作为GUI程序的子进程,反之亦然。

您需要一些IPC(Inter-process communication)机制,例如shared memorynamed pipe

通常用于网络编程的Socket也可用于使两个进程可通信。

(我刚发现node.js没有FIFO(named pipe)shared memory个套餐。所以,似乎只有这样才能实现您的需求:{{1 }}。)

答案 1 :(得分:0)

是的,QProcess可以抓住stdoutstderr。您可以使用进程发出的readyReadStandardOutput信号来监听其输出,然后通过readAllStandardOutput()等任何qprocess读取方法读取..也可以让您的gui使用{{3}向nodejs标准输入发送消息继承的功能。