gpt4 book ai didi

Qt Desktop 使用 Node.js 和 Socket.io 监听端口

转载 作者:搜寻专家 更新时间:2023-10-31 23:18:42 27 4
gpt4 key购买 nike

我使用 Qt 构建了一个桌面应用程序。目前,该应用程序定期从远程 Web 服务器上的 XML 文件中提取数据,以填充应用程序中的各种小部件。

与其拉取数据,我宁愿实现一个“推送”环境,在该环境中,Qt 应用程序与远程 Web 服务器上的端口建立持久连接,并监听来自 node.js 的更新或“广播”。

我已经使用 node.js 和 socket.io 使用基于 Web 的应用程序构建了类似的东西,所以我对此并不陌生,但我似乎无法弄清楚如何在 Qt 中完成此操作。我可以使用 QTcpSocket 连接到端口 4000,我可以使用 node.js 启动 HTTP 服务器,但我似乎无法接收任何广播的消息。

这里缺少的是 socket.io,但我不知道如何使用它或在 Qt 中建立所需的连接——所以我不知所措。

在 Qt 应用程序内连接并监听端口 4000

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++ 合并 Socket.io 和 WebSocket 失败后,我尝试使用 QWebView 完成它并且成功了。我将在下面分享我所做工作的详细信息,以防其他人需要帮助。

主窗口.cpp

这只是一个通用的 Qt Gui 应用程序,其唯一目的是创建一个加载 HTML 文件的 QWebView 实例。正在加载(在后台)的 HTML 文件包含建立套接字连接的 javascript 代码。

我创建了一个单独的 Qt 类来与 index.html 中的 javascript 交互,以处理来自服务器的响应。 More Info

#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;
}

http://www.mydomain.com/startconnection.html

这是加载到 Qt 中的页面。它只是建立到 mydomain.com 的 Socket.io 连接,后者正在监听端口 4000 上的连接

<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/www/vhosts/mydomain.com/socket/server.js

这是启动 HTTP 服务监听端口 4000 上的连接的 Node 脚本。我使用“forever”启动服务并将所有 console.info 消息输出到一个日志文件,如下所示:forever -al/var/www/vhosts/mydomain.com/connection.log 启动/var/www/vhosts/mydomain.dom/socket/server.js。

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);

});

});

希望这对某人有帮助!

最佳答案

是的,这是可能的,但您必须了解 Socket.IO 处理 WebSocket 套接字,而不是原始 TCP。您的客户端应该与服务器进行 WebSocket 握手等。当前发生的是您在客户端创建一个“HTTP”连接,不发送任何内容并等待发生的事情。 (什么都不会发生。)

当然,您也可以设计一个在原始 TCP 之上运行的协议(protocol),例如发送换行符/空分隔(或 netstring 封装)的 JSON blob。

关于Qt Desktop 使用 Node.js 和 Socket.io 监听端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14463638/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com