4、QT中的网络编程

2023-10-29

一、Linux中的网络编程

1、子网和公网的概念

  • 子网网络:局域网,只能进行内网的通信
  • 公网网络:因特网,服务器等可以进行远程的通信

2、网络分层模型

4层模型:应用层、传输层、网络层、物理层

  • 应用层:用户自定义的网络数据传输协议:ssh、tftp、tfp、http 等
  • 传输层:tcp/udp出传输协议
  • 网络层:IPV4/IPV6,3G,4G,5G等网络协议
  • 物理层:光纤、路由器、网线、网卡

3、Tcp与Udp协议的区别

  • 三次握手:第一次握手就是客户端给服务器端发送一个报文,第二次就是服务器收到报文之后,会应答一个报文给客户端,第三次握手就是客户端收到报文后再给服务器发送一个报文,三次握手就成功了。(进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常)

  • Tcp传输协议:可靠传输协议,Tcp需要三步握手连接,每次通信都会进行数据的校验

  • Tcp的应用:一般用于文件的传输、控制命令的传输

  • Udp传输协议:不可靠传输协议,Udp传输不需要建立连接,Udp不会进行数据校验

  • Udp的应用:一般用于多媒体的数据传传输:屏幕广播软件、视频网站、直播软件

二、TCP通信

1、QTcpSocket Class 客户端类

Header: #include 头文件
qmake: QT += network 模块
Inherits: QAbstractSocket 父类
Inherited By: QSctpSocket and QSslSocket 派生类

在这里插入图片描述

2、函数接口

构造函数:
QTcpSocket(QObject *parent = nullptr)
//链接服务器 IP+端口
connectToHost(const QHostAddress &, quint16, QIODevice::OpenMode )
QHostAddress : IP地址
quint16 : 端口号
------------------------------------------------------------------
//直接填写IP 地址即可链接
connectToHost(const QString &, quint16, QIODevice::OpenMode, QAbstractSocket::NetworkLayerProtocol )
例子:
socket->connectToHost("192.168.25.2",1000);

3、数据的收发

//数据的发送
write(const char *, qint64 ) //发送 qint64大的数据
write(const char *)//直接发送字符数据
write(const QByteArray &) //发生QByteArray类型的数据

//数据的接收
qint64 read(char *, qint64 ) //读取 qint64大的数据到 char * 地址 上
QByteArray read(qint64 ) //读取 qint64 大的数据 并返回
QByteArray readAll() //读取所有数据
//关联可读信号
[signal] void QIODevice::readyRead()

4、QTcpServer Class 服务器类

Header: #include
qmake: QT += network
Inherits: QObject
Inherited By: QSctpServer

5、函数接口:

构造函数:
QTcpServer(QObject *parent = nullptr)
//绑定并监听接口
bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port= 0)
QHostAddress::Any : 相当于 INADDR_ANY.自动监听本地的所有地址
port : 取值范围 0 - 65535,尽量用 1000 以后的,因为 1000前,系统占用
例子: 监听本地IP地址
server->listen(QHostAddress::Any,6666)

接收链接请求:
//服务器新的链接信号
[signal] void QTcpServer::newConnection()
//服务器 产生新的对象
[virtual] QTcpSocket*QTcpServer::nextPendingConnection()

6、数据的收发 :

//产生新的通信对象
QTcpSocket *new_socket = server->nextPendingConnection();
//通过的新的对象进行数据的收发
write(const char *, qint64 ) //发送 qint64大的数据
write(const char *)//直接发送字符数据
write(const QByteArray &) //发生QByteArray类型的数据
//接收数据
//1.关联新的对象的可读 信号
[signal] void QIODevice::readyRead()
//2.在槽函数中读取数据
qint64 read(char *, qint64 ) //读取qint64 大的数据到 char * 地址 上
QByteArray read(qint64 ) //读取 qint64大的数据 并返回
QByteArray readAll() //读取所有数据

练习:实现客户端与调试助手的双向通信

①、服务端:Server.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1、创建一个服务器对象
    server = new QTcpServer(this);

    //2、开始监听
    if(server->listen(QHostAddress :: Any, 7777))
    {
        qDebug() << "监听成功" << endl;
    }
    else
    {
        qDebug() << "监听失败" << endl;
    }

    //3、关联新的链接信号
    connect(server, SIGNAL(newConnection()), this, SLOT(accept_connect()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

int i=0;
QTcpSocket *new_socket ;

void MainWindow :: accept_connect()
{
    qDebug() << "有新的链接请求处理" << endl;

    //产生新的通信对象
    new_socket = server->nextPendingConnection();

    //哪里产生对象,就哪里关联
    connect(new_socket, SIGNAL(readyRead()), this, SLOT(read_data()));
}

//收到信息读取
void MainWindow :: read_data()
{
    QString msg = new_socket->readAll();

    //取出发送者的IP地址
    qDebug() << new_socket->peerAddress() << endl;
    qDebug() << msg <<endl;
	//显示收到信息
    ui->textBrowser->setText(msg);
}

//发送信息给客户端
void MainWindow::on_pushButton_clicked()
{
    QString msg = ui->textEdit->toPlainText();
    new_socket->write(msg.toUtf8());
}

②、服务端:Client.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

QTcpSocket *socket;
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1、创建客户端通信对象
    socket = new QTcpSocket(this);

    //2、链接服务器
    socket->connectToHost("192.168.124.54", 7777);

    //3、数据的发送
    socket->write("Hello ");

    //4、关联刻度信号
    connect(socket, SIGNAL(readyRead()), this, SLOT(read_date()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

//读取信息
void MainWindow::read_date()
{
    QString msg = socket->readAll();
    //显示收到信息
    ui->textBrowser->setText(msg);
}

//发送信息
void MainWindow::on_pushButton_clicked()
{
    QString msg = ui->textEdit->toPlainText();
    socket->write(msg.toUtf8());
}

三、UDP通信

在这里插入图片描述

1、QUdpSocket Class类

Header: #include 头文件
qmake: QT += network 模块
Inherits: QAbstractSocket 父类

2、函数接口:

构造函数:
QUdpSocket(QObject *parent = nullptr)
发送数据的接口:
qint64 writeDatagram(const char *data, qint64 size, const QHostAddress &address,quint16 port)
data:需要发送的数据
size:数据的大小
address:接收端的IP
port : 接收端的端口
qint64 writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)

3、接收端:

1.绑定UDP socket
bool QAbstractSocket::bind(const QHostAddress &address, quint16 port = 0)
address:需要绑定的地址
port:需要绑定的端口

2.读取数据
qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address =nullptr, quint16 *port = nullptr)
data:读取后数据的存放地址
maxSize:读取的数据最大值
address:发送者的IP
port:发生者的端口

QNetworkDatagram QUdpSocket::receiveDatagram(qint64 maxSize = -1)
QNetworkDatagram 网络数据管理类
QHostAddress senderAddress() const //发送者的IP
int senderPort() const //发生者端口
int destinationPort() const 获取对方的端口

练习:

①、接收端:recv.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QNetworkDatagram>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //1、创建接收端
    socket = new QUdpSocket(this);

    //2、绑定
    if(socket->bind(QHostAddress::Any, 7777))
    {
        qDebug() << "绑定成功" << endl;
    }
    else
    {
        qDebug() << "绑定失败" << endl;
    }

    //3、关联可读信号
    connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::readData()
{
    qDebug() << "读取数据" << endl;

    //判断是否有网络数据
    while (socket->hasPendingDatagrams())
    {
        //把所有的数据读取到msg
        QNetworkDatagram msg = socket->receiveDatagram();

        //输出IP和Port信息
        qDebug() << msg.senderAddress().toString() << endl;
        qDebug() << msg.senderPort() << endl;

        //把发送端发送的数据转化为原来的QString类型数据
        QString decodeMsg = QString :: fromUtf8(msg.data());

        //输出数据
        qDebug() << decodeMsg << endl;
    }
}

②、发送端:send.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1、创建发送端
    socket = new QUdpSocket(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}

//按键按下发送信息
void MainWindow::on_pushButton_clicked()
{
    //获取对话框信息
    QString msg = ui->lineEdit->text();
    //利用套接字发送信息
    socket->writeDatagram(ui->lineEdit->text().toUtf8(), QHostAddress("192.168.124.54"), 7777);
}

四、HTTP 请求

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的信息以及得到什么样的响应
简单理解:客户通过http请求协议从服务器中获取需要的数据

免费API接口

http://api.qingyunke.com/ //机器人 api
舔狗API 官网
http://v2.alapi.cn
http://v2.alapi.cn/api/dog?
token=3ydsG67GrDABA97n(自己的token)
http://v2.alapi.cn/api/acg?
token=3ydsG67GrDABA97n(自己的token)
http://v2.alapi.cn/api/acg?
token=3ydsG67GrDABA97n(自己的token)

五、QT 中的HTTP 请求

1、QNetworkAccessManager Class网络请求管理器

Header: #include
qmake: QT += network
Since: Qt 4.4
Inherits: QObject

2、官方的请求 demo

//1.新建网络请求 管理器
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
//关联管理器的 finished 信号
connect(manager,&QNetworkAccessManager::finished,this, &MyClass::replyFinished);
//2.往http://qt-project.org 网站发起请求
manager->get(QNetworkRequest(QUrl("http://qtproject.org")));
网络请求信号:
void finished(QNetworkReply *reply)

在这里插入图片描述

3、QNetworkReply Class 网络请求数据管理器

Header: #include
qmake: QT += network
Since: Qt 4.4
Inherits: QIODevice

4、函数接口

//读取所有网络返回的数据
readAll()
//信号
void downloadProgress(qint64 bytesReceived,
qint64 bytesTotal) 下载进度信号
void finished() 下载完毕信号
void readyRead() 有数据可读信号

练习:获取舔狗API的数据

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
//添加网络请求管理器
#include <QNetworkAccessManager>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //1、新建网络请求管理器
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);

    //2、关联管理器的finished信号
    connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));

    //3、往http://qt-project.org 网站发起请求
    manager->get(QNetworkRequest(QUrl("http://v2.alapi.cn/api/dog?token=1tXlTpqdAcx4jXVm")));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::replyFinished(QNetworkReply *reply)
{
    //读取所有的网络数据
    QString  msg = reply->readAll();

    ui->textBrowser->setText(msg);

}
  • 注意:假如QT不能使用https,可以把https改为http
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4、QT中的网络编程 的相关文章

  • 如何访问Loader的sourceComponent中的QML对象?

    我可能需要读取或写入的一些属性Loader s sourceComponent来自一些外部函数 访问该房产的方式是什么x里面的对象的Loader s sourceComponent import QtQuick 2 0 Item width
  • QWidget::showMinimized() 不起作用

    在 Ubuntu 13 04 上 如果使用QWidget showMinimized 为了最小化窗口 我发现通过单击系统任务栏上的应用程序图标恢复它后 调用QWidget showMinimized 无法工作 connect minimum
  • 包含 Qt 标头的正确方法是什么?

    到目前为止我知道几种方法 includeQt 类 include
  • 如何在 Qt-Creator 中添加自定义构建步骤?

    构建我的应用程序后 我想将其复制到特定目录 在 Windows 7 上 自定义构建步骤 cmd exe c k copy MyPlugin dll HostApp Debug plugins 但我有错误 Can t run process
  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • QT C++ QRegularExpression 多个匹配

    我想使用正则表达式从 QString html 中提取信息 我明确想使用正则表达式 无解析器解决方案 和类Q正则表达式 http qt project org doc qt 5 0 qtcore qregularexpression htm
  • 无法将 [未定义] 分配给 QColor

    我正在使用 Qt 5 11 构建 运行代码 代码中有QML风格如下 Button style delegate Component id enabledButtonStyle ButtonStyle padding top 0 paddin
  • 在 Windows 上以 QML 播放 RTSP 视频

    我正在尝试将 QML 中的 RTSP 流播放到视频标签中 如下所示 Repeater model 8 Video Layout fillWidth true Layout fillHeight true fillMode VideoOutp
  • C++ QT libXL 错误:“启动期间程序退出,代码为 0xc0000135”

    我正在尝试编写一个使用 libXL 的 QT 应用程序 但是当我尝试编译时 我收到一个弹出框 显示 During Startup program exited with code 0xc0000135 我已经准确地找出了哪一行导致了问题 它
  • MSVC C4100:“应用程序”:未引用的形式参数警告

    使用 MSVC 编译时 以下代码会生成 C4100 警告 这怎么可能 显然引用了 应用程序 class ApplicationInfo public QObject Q OBJECT public static void initializ
  • 为什么anchors.centerIn不适用于Column元素?

    我有这段 QML 代码 Column spacing units gu 2 anchors fill parent centerIn parent Row spacing units gu 4 Row spacing units gu 4
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • QGraphicsSimpleTextItem“无效使用不完整类型”

    我的代码如下 指针部件 h QGraphicsSimpleTextItem text 指针控件 cpp void PointerWidget placeNumbers float spacing int currentTickNumber
  • 当给定 100k 项时,QListView 需要很长时间才能更新

    我在读取文件时遇到问题 具体是我想制作一本小字典 在我需要阅读的文件中有这样的内容 a Ph P6 a snsr CA a b c fb Dj a b c book i BS A except B gate oOPa y a font kQ
  • Qt 和 MOC 的困境与简单的制作

    我想这更像是一个 GNU Make 问题 而不是 Qt 和 moc 但这里是 我有一个包含多个目录Q OBJECTS 我有一些简单的代码 它收集所有这些 例如 MOCS shell grep l Q OBJECT HEADERS Assum
  • 在 Windows 上静默安装 Qt55 Enterprise

    编辑 在 Qt 支持的帮助下 我已经解决了如何自动化 Qt 企业安装程序的这两个部分 下面是脚本调用 我正在尝试在 Windows 8 1 和 Windows 10 上静默安装 Qt 5 5 1 Enterprise 使用 script 开
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • QGraphicsView 在完整布局中未最大化

    I have following GUI having four QGraphicView objects 正如您在每个视图下看到的那样 它有四个工具按钮 为了最大化视图 我连接了工具按钮的信号来隐藏其他三个视图的插槽 并将大小策略设置为扩
  • 渲染具有透明度的纹理时,OpenGL 不需要的像素

    我已经为这个问题苦苦挣扎了一段时间了 当我使用 OpenGL 渲染 2D 纹理 在无透明度和部分透明度之间的过渡上具有透明度值 时 我得到了一些烦人的灰色像素 我认为这是像素值插值的产物 关于如何改进这一点有什么想法吗 I m attach

随机推荐

  • spring实战笔记

    Environment中获取配置 方式一 直接getProperties获取String bootstrapServers env getProperty hello kafka bootstrap servers 方式二 将属性直接绑定到
  • 二、Python基本语法

    二 基本语法 一 说明 二 内容 1 注释 2 变量 3 数据类型 4 列表和字典 5 输入和输出 6 字符串操作 7 运算符 8 条件语句 9 循环语句 10 函数 11 匿名函数 12 类和对象 13 模块和包 14 异常处理 15 文
  • Windows下配置cygwin/cmake

    对于那些低配置的电脑 要在windows做一些简单的coding work 安装一个VS实在有些转不开 所以我首先想到了通过cygwin cmake配置一个简单的开发环境 对于我那台老旧的IBM T43完全没问题 1 安装cygwin 首先
  • 新Android病毒出现 自动下载且无法卸载

    不久前XcodeGhost的事情令大家还未平复 现在又有针对Android平台的新病毒被曝光 国家计算机病毒应急处理中心监测发现 一种新的感染安卓手机的病毒a expense GhostPush a出现 该病毒可自动下载安装其他APP 而且
  • windows安装VMware虚拟机(附带CentOS7部署)

    软件下载 链接 https pan baidu com s 1Vw2Bilf9uf EYR6 MR86aA pwd d2qr 提取码 d2qr VMware安装 通你上述链接下载VMware安装包 没有特别选项 选安装位置无脑下一步安装 安
  • linux工具之sar

    sar System Activity Reporter 系统活动情况报告 是目前 Linux 上最为全面的系统性能分析工具之一 可以从多方面对系统的活动进行报告 包括 文件的读写情况 系统调用的使用情况 磁盘 I O CPU 效率 内存使
  • python写入文件的几种方式_python文本文件读写的3种方法

    第一种方法 file1 open test txt file2 open output txt w while True line file1 readline 这里可以进行逻辑处理 file2 write line s if not li
  • 华为硬件工程师社招机考题库_华为校招_硬件技术工程师机考试题及答案

    1 判断题 DRAM 上电时存储单元的内容是全 0 而 Flash 上电时存储单元的内容是全 1 4 分 A 正确 B 错误 FLASH 可保存 2 判断题 眼图可以用来分析高速信号的码间 干扰 抖动 噪声和衰减 4 分 A 正确 B 错误
  • VUE element-ui之table表格横向展示(表尾汇总)

    产品需求 在正常表格下方进行一系列汇总 如 合计等 分析之后发现需要拼接一个或多个横向排列的表格 实现步骤 模板部分
  • 合并二叉排序树

    描述 先序建立两棵二叉排序树 采用二叉链表结构存储 将这两棵二叉排序树合并成一棵新的二叉排序树 并按照中序序列输出合并后的二叉排序树 输入 输入两行先序遍历的整型数据 并以此分别建立两棵二叉排序树 其中整型数据必须为大于等于零的整数 如输入
  • Moba游戏帧同步的技术原理与重点难点

    一 帧同步的技术原理 帧同步是通过在数据传输过程中插入同步字节或同步信号来保证数据的同步 它主要通过以下几个步骤实现 对啦 这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白 也有一些正在从事游戏开发的技术大佬 欢迎你来交流学习
  • <逆波兰表达式求值>

    描述 给你一个字符串数组 tokens 表示一个根据 逆波兰表示法表示的算术表达式 请你计算该表达式 返回一个表示表达式值的整数 注意 有效的算符为 和 每个操作数 运算对象 都可以是一个整数或者另一个表达式 两个整数之间的除法总是 向零截
  • Linux装jdk并配置环境详细步骤

    Linux装jdk并配置环境详细步骤 1 创建文件使用命令mkdir usr local jdk 2 通过xshell传上来的文件都在 root目录下通过命令ls可以查看然后需要移动文件移动文件位置mv jdk 8u161 linux x6
  • Java——接口与实现类

    目录 接口 实现接口 常用接口 java util Comparator Arrays sort Object arr Comparator c 常用接口 java lang Comparable Arrays sort Object ar
  • Appuploader 常见错误及解决方法

    问题解决秘籍 1 遇到问题 第一个请登录苹果开发者官网 检查一遍账号是否有权限 是否被停用 是否过期 是否有协议需要同意 并且在右上角切换账号后检查所有关联的账号是否工作正常 apple账号的邮箱也是个重要的地方 当有ipa上传 账号有发生
  • 搭建SpringCloud项目,并实现自动化部署

    在当今云计算时代 微服务架构已经成为企业开发的常见选择 而SpringCloud作为Java领域中最为流行的微服务框架之一 其提供的各种组件能够帮助开发者快速搭建微服务应用 本文将介绍如何搭建SpringCloud项目 并实现自动化部署 一
  • sessionStorage和localStorage的区别

    今天就来说一下sessionStorage和localStorage的区别以及使用 sessionStorage 内存 sessionStorage大约能存储5M左右 生命周期 浏览器窗口关闭就自动销毁 属性方法 存储数据 sessionS
  • qt使用QTreeWidget实现一个树结构显示数据

    效果图 include
  • MYSQL解决 The total number of locks exceeds the lock table size 问题

    当我们对Mysql 中的表进行大批量的分组 查询 创建的时候经常会出现这个问题 他翻译过来大概是这个意思 总数已经超过锁定表的大小 一般出现这个原因会有两种可能 1 MySQL的临时表过小也就是tmp table size tmp tabl
  • 4、QT中的网络编程

    一 Linux中的网络编程 1 子网和公网的概念 子网网络 局域网 只能进行内网的通信 公网网络 因特网 服务器等可以进行远程的通信 2 网络分层模型 4层模型 应用层 传输层 网络层 物理层 应用层 用户自定义的网络数据传输协议 ssh