Qt Desktop使用Node.js和Socket.io侦听端口
我使用Qt构建了一个桌面应用程序。目前,应用程序定期从远程web服务器上的XML文件中提取数据,以填充应用程序中的各种小部件 我宁愿实现一个“推送”环境,在这个环境中,Qt应用程序与远程web服务器上的端口建立持久连接,并侦听node.js的更新或“广播”,而不是拉取数据 我已经使用node.js和socket.io构建了一个基于web的应用程序,所以我对这一点并不陌生,但我似乎不知道如何在Qt中实现这一点。我可以使用QTcpSocket连接到端口4000,也可以使用node.js启动HTTP服务器,但我似乎无法接收任何广播的消息 这里缺少的一个部分是socket.io,但我不知道如何使用它或在Qt内建立所需的连接,所以我不知所措 在Qt应用程序内部的端口4000上连接并侦听Qt Desktop使用Node.js和Socket.io侦听端口,qt,node.js,socket.io,Qt,Node.js,Socket.io,我使用Qt构建了一个桌面应用程序。目前,应用程序定期从远程web服务器上的XML文件中提取数据,以填充应用程序中的各种小部件 我宁愿实现一个“推送”环境,在这个环境中,Qt应用程序与远程web服务器上的端口建立持久连接,并侦听node.js的更新或“广播”,而不是拉取数据 我已经使用node.js和socket.io构建了一个基于web的应用程序,所以我对这一点并不陌生,但我似乎不知道如何在Qt中实现这一点。我可以使用QTcpSocket连接到端口4000,也可以使用node.js启动HTTP服
void MainWindow::connectTcp() {
client = new QTcpSocket(this);
QHostAddress hostadd("myIPaddress");
connect(client,SIGNAL(connected()),this,SLOT(isConnected()));
connect(client,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(connectionError(QAbstractSocket::SocketError)));
connect(client, SIGNAL(readyRead()), this, SLOT(readTcpData()));
client->connectToHost(hostadd,3000);
}
在node.js中创建服务器并发送更新
var http = require('http');
var url = require('url');
var msg = '';
var port = 4000;
/* path to socket.io */
var path = '/path/to/node_modules/socket.io';
var server = http.createServer(function (req, res) {
req.on('data', function (d) {
data += d;
});
req.on('end',function(){
msg = data;
res.writeHead(200,{'Content-Type':'text/plain'});
res.write(msg);
res.end();
console.log('SEND DATA: ',msg);
});
}).listen(port);
任何建议都非常感谢——我想做的事情可能吗
编辑--更新
使用C++后,未能合并SoCKI.IO和WebSocket,我尝试用QWebVIEW做它,它工作了。我在下面分享我所做的细节,以防其他人需要帮助
main window.cpp 这只是一个通用的QtGUI应用程序,其唯一目的是创建一个加载HTML文件的QWebView实例。正在加载的HTML文件(在后台)包含建立套接字连接的javascript代码 我创建了一个单独的Qt类来与index.html中的javascript接口,以对来自服务器的响应进行操作希望这对别人有帮助 是的,这是可能的,但您必须了解Socket.IO处理的是WebSocket套接字,而不是原始TCP。您的客户端应该与服务器进行WebSocket握手,等等。当前正在发生的是,您在客户端创建一个“HTTP”连接,不发送任何内容,然后等待发生一些事情。(什么也不会发生。) 当然,您也可以设计一个在原始TCP之上运行的协议,例如发送换行符/空分隔(或netstring封装)的JSON块。您可以看看,它使用Qt实现WebSocket。我还构建了client和server socket.io类,它们很快就会开源 编辑:
找到它谢谢。我到处搜索,找到了一个C++版本的SoCKE.IO版本。需要Boost和其他依赖项。我会试一试,如果成功的话,我会回应的。运气不好。我使用BooS.Org网站的指令安装了C++的Boost库,然后安装了。我安装了Socket.io和WebSockets。我有一大堆错误——让我相信这个解决方案只针对微软Visual C++,而不是QT.GoToCu.IO服务器回调函数。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Set default proxy (this may not always be necessary)
QNetworkProxyFactory::setUseSystemConfiguration(true);
h = new Hello(this);
view = new QWebView(this);
view->load(QUrl("http://www.mydomain.com/startconnection.html"));
// I don't want the webview to show, it should run in the background
view->hide();
frame = view->page()->mainFrame();
connect(view,SIGNAL(loadFinished(bool)),this,SLOT(loadFinished(bool)));
}
void MainWindow::loadFinished(bool loaded) {
qDebug() << "Webpage Loaded? " << loaded;
}
MainWindow::~MainWindow()
{
delete ui;
}
<html>
<head>
<script type="text/javascript" src="http://www.mydomain.com:4000/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket;
window.onload = onLoad;
function onLoad() {
socket = io.connect('http://www.mydomain.com:4000');
socket.on('connect', function(){
alert("Connected To Socket");
});
socket.on('message',function(data) {
alert("Here Comes A Message From The Server");
});
}
</script>
</head>
<body>
</body>
</html>
var http = require('http');
var url = require('url');
var qs = require('querystring');
var child_process = require('child_process');
var theSockets = {};
/* listening port */
var port = 4000;
/* path to socket.io on server */
var path = '/var/www/vhosts/mydomain.com/httpdocs/server/node_modules/socket.io';
var server = http.createServer(function (req, res) {
var data = '';
var msg = '';
req.on('data', function (d) {
data += d;
});
req.on('end',function(){
msg = data;
io.sockets.emit('message',msg);
res.end();
});
}
res.end();
}).listen(port);
var io = require(path).listen(server);
io.sockets.on('connection', function(socket) {
var d = new Date();
console.log('JOINED SOCKET '+d.toLocaleString()+' SOCKET ID '+socket.id);
socket.on('disconnect',function() {
var d = new Date();
console.log('EXITED SOCKET '+d.toLocaleString()+' SOCKET ID '+socket.id);
});
});