QT开启websocket server(QWebSocketServer) 网页做为客户端
https://stackoverflow.com/questions/5673827/is-there-an-example-websockets-for-qt
QT项目中
.pro文件:
1 2 3 4 5 | QT += core gui #获取串口列表倒包 QT += serialport #创建websocket倒包 QT += websockets |
inspection_server.h :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #ifndef __INSPECTION_SERVER_HPP__ #define __INSPECTION_SERVER_HPP__ #include <QWebSocketServer> #include <QWebSocket> #include <QObject> #include <iostream> #include <memory> class InspectionServer; typedef std::shared_ptr<QWebSocketServer> QWebSocketServerPtr; typedef std::shared_ptr<QWebSocket> QWebSocketPtr; typedef std::shared_ptr<InspectionServer> InspectionServerPtr; class InspectionServer: public QObject { Q_OBJECT QWebSocketServerPtr websocketServer; QList<QWebSocketPtr> clients; public : InspectionServer(uint16_t port); signals: void closed(); private slots: void onNewConnection(); void processTextMessage( const QString& message); void socketDisconnected(); }; #endif |
inspection_server.cpp文件:
#include "inspection_server.h" #include <QDebug> InspectionServer::InspectionServer(uint16_t port) : websocketServer(new QWebSocketServer(QStringLiteral("Inspection server"), QWebSocketServer::NonSecureMode)) { if(this->websocketServer->listen(QHostAddress::Any, port)) { QObject::connect(websocketServer.get(), SIGNAL(newConnection()), this, SLOT(onNewConnection())); } else { throw std::runtime_error("InspectionServer: failed to listen"); } } void InspectionServer::onNewConnection() { qInfo() << "InspectionServer::onNewConnection"; QWebSocketPtr socket(this->websocketServer->nextPendingConnection()); QObject::connect(socket.get(), SIGNAL(textMessageReceived(const QString&)), this, SLOT(processTextMessage(const QString&))); QObject::connect(socket.get(), SIGNAL(disconnected()), this, SLOT(socketDisconnected())); this->clients.append(socket); } void InspectionServer::processTextMessage(const QString& message) { qInfo() << "InspectionServer::processTextMessage: " << message; } void InspectionServer::socketDisconnected() { qInfo() << "InspectionServer::socketDisconnected"; }
在main.cpp中调用、开启服务:
#include "mainwindow.h" #include <QApplication> //导入串口包 #include <QCoreApplication> #include <QList> #include <stdio.h> #include <QDebug> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> //创建websocket #include <QWebSocketServer> #include "inspection_server.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); // MainWindow w; // w.show(); qDebug()<< "main.cpp执行了"; InspectionServer server(1234); return a.exec(); }
打开一个网页index.html (必须使用node等脚本开启html服务 , http://localhost:5050/)
start.js :
var http = require('http');//创建服务器的 var fs = require('fs'); //引入进来的是模块,模块中有方法,下一步就是使用方法 //Node.js一个最主要的特点:执行的基本都是函数 //创建服务 var myServer = http.createServer(function(req,res){ //req->请求变量:客户端请求服务器的 //res->响应变量:服务器要给客户端写回的变量 //前端页面应该给客户端显示,即写回去 //这之前应该先把文件内容读出来 var html = fs.readFileSync('./index.html') res.write(html); //结束写的操作 res.end(); }) //服务端等着客户端请求需要做一个监听。通过创建的服务。 //监听 myServer.listen('5050',function(err){ if(err){ console.log(err); throw err; } console.log("服务器已开启。端口号为:5050"); }) //浏览器请求服务器。知道当前计算机的ip地址。例如,127.0.0.1:3000
index.html :
<html> <body> <button onClick="initWebSocket();">Connect</button> <br> <input type="text" id="messageInput"> <button onClick="sendMessage();">Send message</button> </body> </html> <script type="text/javascript"> var websocket = null; var start = function () { websocket = new WebSocket("ws://localhost:1234"); } websocket.onopen = function () { console.log('链接开始了') } ws.onmessage = function (evt) { var received_msg = evt.data; console.log("数据已接收...", received_msg); }; ws.onclose = function () { // 关闭 websocket alert("连接已关闭..."); }; //直接开启websocket start(); function sendMessage() { websocket.send(document.getElementById("messageInput").value); } </script>
最后一步,执行脚本命令开启服务:
1 | node start.js |
效果:
在浏览器中打开http://localhost:5050/这个地址的网页,如下图。
在QT的IDE控制台中会打印出LOG:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)