Qt-Web混合开发-QWebSocket简单客户端(7) 原创
Qt-Web混合开发-使用QWebSocket实现的简单客户端程序💚💜🉑🍑
更多精彩内容 |
---|
👉个人内容分类汇总 👈 |
👉Qt - Web混合开发👈 |
1、概述🐛🦆
- Qt版本:V5.12.5
- WebSocket服务端程序
- WebSocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
- WebSocket和Http的异同点
相同:
- 建立在TCP之上,通过TCP协议来传输数据;
- 都是可靠性传输协议;
- 都是应用层协议。
差异:
- WebSocket是HTML5中的协议,支持持久连接,HTTP不支持持久连接;
- HTTP是单向协议,只能由客户端发起,做不到服务器主动向客户端推送信息。
2、实现效果😅🙏
3、实现功能🐮🐴
- 实现连接、断开连接、数据发送、数据接收显示功能;
- 采用的是【非安全模式】 ;
4、实现流程👊👴👊
- 创建QWebSocket客户端对象;
- 绑定信号槽;
- connected:连接成功信号;
- disconnected:断开连接信号;
- textFrameReceived:接收到文本数据时的信号。
- 连接WebSocket服务端
QWebSocket::open(const QUrl &*url*)
;- 接收数据/发送文本数据
QWebSocket::sendTextMessage(const QString &*message*)
;- 断开连接
QWebSocket::close(QWebSocketProtocol::CloseCode *closeCode* = QWebSocketProtocol::CloseCodeNormal, const QString &*reason* = QString())
;
- 参数closeCode:关闭原因;
- 参数reason:关闭原因描述文本。
5、关键代码💳🛣️🍐
- pro文件
QT += websockets
- widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QWebSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_connected(); // 连接成功
void on_disconnected(); // 断开连接
void on_textMessageReceived(const QString &message); // 接收数据
void on_but_connect_clicked();
void on_but_send_clicked();
private:
Ui::Widget *ui;
QWebSocket m_client;
};
#endif // WIDGET_H
- widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle(QString("QWebSocket客户端简单示例 - V%1").arg(APP_VERSION)); // 设置窗口标题
connect(&m_client, &QWebSocket::connected, this, &Widget::on_connected);
connect(&m_client, &QWebSocket::textFrameReceived, this, &Widget::on_textMessageReceived);
connect(&m_client, &QWebSocket::disconnected, this, &Widget::on_disconnected);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_connected()
{
ui->textEdit->append("连接成功!");
ui->but_connect->setText("断开连接");
}
void Widget::on_disconnected()
{
ui->textEdit->append("断开连接!");
ui->but_connect->setText("连接");
}
/**
* @brief 接收数据
* @param message
*/
void Widget::on_textMessageReceived(const QString &message)
{
ui->textEdit->append(message);
}
/**
* @brief 连接/断开连接控制
*/
void Widget::on_but_connect_clicked()
{
if(ui->but_connect->text() == "连接")
{
m_client.open(QUrl(ui->lineEdit_url->text().trimmed()));
}
else
{
m_client.close();
}
}
/**
* @brief 发送数据
*/
void Widget::on_but_send_clicked()
{
if(m_client.state() == QAbstractSocket::ConnectedState) // 判断是否连接
{
m_client.sendTextMessage(ui->lineEdit_send->text());
}
}
6、源代码🐍🉐
. /> フ
| ● ● l
/` ミ_xノ
/ |
/ ヽ ノ
│ | | |
/ ̄| | | |
| ( ̄ヽ_ヽ)__)
\二つ 🐁
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~