Qt中的网络编程(TCP)

news2024/12/23 20:16:50

在Qt中网络编程主要由Qt Network模块来编写基于TCP/Ip的网络程序,其中提供了许多的类:

可以点击该链接查看:Qt网络C++类|Qt网络 5.15.12

 常见的有:

QTcpServer基于 TCP 的服务器
QTcpSocketTCP 套接字
QUdpSocketUDP 套接字
QDtls此类为 UDP 套接字提供加密

QHostAddress

IP地址
QHostInfo用于主机名查找的静态函数
QLocalServer基于本地套接字的服务器
QLocalSocket本地插座
QNetworkAccessManager允许应用程序发送网络请求和接收答复
QNetworkCacheMetaData缓存信息
QNetworkDatagramUDP 数据报的数据和元数据
QNetworkInterface列出主机的 IP 地址和网络接口
QNetworkProxy网络层代理

 使用时:需要在pro文件中添加 QT +=network 

Socket(套接字) 

套接字由 ip和端口号组成    ip指定主机  端口指定主机的一个程序,通过套接字来实现网络中两台主机的通信。

TCP 

TCP是用于数据传输的低级网络协议 ,它是一种可靠的、面向流的、面向连接的传输协议。它特别适合数据的连续传输。是一种面向数据流何连接的可靠的传输协议。

TCP分为客户端(TCP Client)和服务器端(TCP Server),在任何数据传输之前,必须建立一个TCP连接到远程的主机和端口上

TCP的两个类:

  • QTcpSocket  (TCP套接字)
  • QTcpServer(TCP服务器)

注意:QTcpSocket是基于流进行传输的

QTcpSocket类 :

QTcpSocket 继承自QAbstractSocket,为TCP提供一个接口

常用的函数:

peer:是对使用TCP协议连接在一起的主机的统称

在任何时候peer都可以关闭连接,这样数据传输就会立刻停止

localAddress()

本地套接字的主机地址(如果可用),否则返回空

等价于QHostAddress::LocalHost(127.0.0.1)用于连接本地主机

localPort()返回本地套接字的主机端口号,否则返回0
peerAddress()如果套接字处于连接状态,返回连接的对等方的地址,否则返回NULL
peerName()返回由connectToHost()指定的对等方的名称
peerPort()如果套接字处于连接状态,返回连接的对等方的端口
connectToHost()尝试与给定端口上的主机名建立连接。协议参数可用于指定要使用的网络协议(例如。IPv4 或 IPv6)。
discinnectFromHost()尝试关闭套接字。如果有挂起的数据等待写入,QABstractSocket 将进入 Closesing State并等待所有数据都写入完毕
error()返回上次发生的错误类型。
flush()此函数尽可能多地从内部写入缓冲区写入基础网络套接字,而不会阻塞

isValid()

如果套接字有效且可供使用,返回true否则返回False
proxy()返回此套接字的网络代理
readBufferSize()返回内部读取缓冲区的大小
read()读取数据
write()写入数据
readDate()读取数据

readLineData()

读取一行数据
writeData()写数据
bytesAvailable()返回可用于读取的字节数
setLocalAddress()设置地址
setLocalPort()设置端口号
setPeerAddress()设置连接端的地址
setPeerName()设置连接方的主机名
setPeerPort()设置连接方的端口
setProxy()设置网络代理
setReadBufferSize()设置内部读取缓冲区的大小
waitForBytesWrite(int msecs)此功能将一直阻塞,直到至少一个字节写入套接字并发出 bytesWrite() 信号

waitForReadyRead(int

msecs)

此功能将阻止,直到有新数据可供读取并且发出 readyRead() 信号
waitForConnected(int msecs)等待直到套接字连接完毕,建立连接返回true 否则返回false
waitForDisConnected(int msecs)等待直到套接字断开连接

信号:

connected()成功建立连接后发出
disconnected()断开连接后发出
errorOccured()发生错误后发出(Qt 5.15中引入)
readyRead()每次有新的数据块到达时都会发出

QNetworkProxy::ProxyType:

QNetworkProxy::NoProxy不使用代理
QNetworkProxy::DefaultProxy代理是根据使用setApplictionProxy设置的程序代理确定的
QNetworkProxy::Socks5Proxy使用Socks5代理(任何类型的连接的通用代理)
QNetworkProxy::HttpProxy使用 HTTP 透明代理(使用“连接”命令实现,仅支持传出TCP连接;支持身份验证。)
QNetworkProxy::HttpCachingProxy仅代理 HTTP 请求
QNetworkProxy::FtpCachingProxy仅代理 FTP 请求

客户端的建立过程:

  1. 创建一个QTcpSocke对象,QString 获取信息
  2. 使用connectToHost()来连接服务器端
  3. 如果有数据可用 会触发readyRead()
  4. 创建流,和设置版本号
  5. 使用bytesAvailable()函数来获取数据的大小
  6. 然后通过流读取数据
  7. 如果出现错误,Qt5.15 之前的版本使用SIGNAL(error(QAbstractSocket::SocketError)) Qt5.15版本之后使用errorOccured()

QTcpServer类:

QTcpServer可以接受传入的 TCP 连接。您可以指定端口或让 QTcpServer 自动选择一个端口。您可以侦听特定地址或所有计算机的地址。

函数:

listen(监听地址,端口号)告知服务器监听某个地址,可以指定端口号,如果端口号为0,则自动选择端口号
close()关闭服务器
errorString()返回上次发生的错误
isListening()是否在监听
maxPendingConnections()返回挂起的接受连接的最大数目。默认值为 30
nextPendingConnection()将下一个挂起的连接作为连接的 QTcpsocket 对象返回
pauseAccepting()暂停接受新连接。排队的连接将保留在队列中
resumeAccepting()恢复接受新连接.
proxy()返回此套接字的网络代理,默认为QNetworkProxy::DefaultProxy
serverAddress()如果服务器正在侦听连接,则返回服务器的地址;
serverError()返回上次发生的错误的错误代码
serverPort()如果服务器正在侦听连接,则返回服务器的端口;否则返回 0。
setMaxPendingConnections(int)设置最大的挂起数,默认情况下,限制为 30 个挂起的连接
setProxy将此套接字的显式网络代理设置为网络代理
socketDescriptor()返回服务器用于侦听传入指令的本机套接字描述符,如果服务器未侦听,则返回 -1。
setSocketDescriptor()设置此服务器在侦听到套接字描述符的传入连接时应使用的套接字描述符
waitForNewConnection(int mesc=0,bool *timeout=nullptr)

等待最多毫秒毫秒或直到传入连接可用。这是一个阻塞函数调用。不建议在单线程 GUI 应用程序中使用它,因为整个应用程序将停止响应,直到函数返回waitForNewConnection()。 在没有可用的事件循环时最有用。

非堵塞的替代方案是连接到newConnection()信号

信号:

acceptError()当接受新连接导致错误时,将发出此信号
newConnection()每次有新连接可用时都会发出此信号

使用的大致过程:

  • 创建一个QTcpServer对象
  • 使用listen()来监听传入的连接,每次客户端连接到服务器都会触发newConnection()信号
  • 如果发生错误可以使用 serverError()返回错误的类型,也可以使用errorString()返回具体的描述
  • 调用nextPendingConnection()接受挂起的连接作为连接的QTcpSocket
  • 可以使用 serverAddress()返回正在监听的地址,serverPort()返回正在监听的端口
  • 连接好后需要获取已经连接的套接字
  • 然后使用QTcpSocket::wite()来发送数据
  • 传输完后可以调用qQTcpSocket::disconnectFromHost()来关闭套接字

注意:QTcpServer主要设计用于事件循环,但也可以在没有事件循环的情况下使用,但必须使用waitForNewConnection(),用来阻止(堵塞),直到连接可用或超时到期。

简单的TCP简单的连接: 

TCP服务器端的设计:

创建一个项目名为TCPserver

1.pro文件中添加 QT+=network

 2.再.h文件中添加一个QTcpServer对象

 3.在.cpp文件中添加一些配置

TCP客户端的配置:

创建一个新的项目名为 TCPclient

1.在.pro文件中添加QT+=network

 2.在ui界面中添加以下控件

3. 在.h文件中添加一个QTcpSocket对象和一个QString  quint16 对象

 4.在.cpp中进行连接和读取数据

#include "client.h"
#include "ui_client.h"
#include<QMessageBox>
client::client(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::client)
{
    ui->setupUi(this);
    tcpsocket=new QTcpSocket(this);
    connect(tcpsocket,&QTcpSocket::readyRead,this,[=]()//有新数据可用时
    {
        QDataStream in(tcpsocket);//创建流
        in.setVersion(QDataStream::Qt_5_9);//设置版本号,客户端和服务器端的版本号要一致
        if(size==0)//如果刚开始接收数据
        {
            //如果接收的数据小于两个字节,直接返回
            if(tcpsocket->bytesAvailable()<(int)sizeof(quint16)) return;
            in>>size;//大于两个字节的话保存到size中
        }
        //如果没有得到全部的数据,则返回继续接收数据
        if(tcpsocket->bytesAvailable()<size)return;
        in>>str;//将接收的数据存放到变量中
        ui->lineEdit_3->setText(str);//显示数据

    });
    //如果出现错误,输出错误
    connect(tcpsocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));
}

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

void client::on_pushButton_clicked()//点击连接
{
    size=0;//数据大小重置为0
    tcpsocket->abort();//断开已有的连接
    //连接lineEdit中的主机和端口号
    tcpsocket->connectToHost(ui->lineEdit->text(),ui->lineEdit_2->text().toInt());
}
 void client::displayError(QAbstractSocket::SocketError)//显示连接错误
 {
     QString S=tcpsocket->errorString();//错误信息
     QMessageBox::information(this,"提示信息",S,QMessageBox::Ok);
 }

运行结果:

由于是本地主机:可以输入localhost 或127.0.0.1 都可以运行

 

参考文献 :

使用Qt |进行网络编程Qt网络 5.15.12

QTcpServer 类 |Qt网络 5.15.12

QTcpSocket Class | Qt Network 5.15.12

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

End-to-End Entity Resolution for Big Data: A Survey Matching部分学习笔记

Matching ER的核心是匹配任务&#xff0c;它接收一个块集合作为输入&#xff0c;对于一个块中的每一对候选匹配&#xff0c;它决定它们是否指向相同的真实世界实体。 Preliminaries 匹配决策通常由匹配函数MMM做出&#xff0c;它将每一对实体描述(ei,ej)(e_{i}, e_{j})(ei​…

全网最详细的手把手模拟实现Cache

前言&#xff1a;本文内容较多&#xff08;字数1w&#xff09;&#xff0c;不仅包含理论知识&#xff0c;还进行了全面实践。本文对前三章理论内容粗略解释&#xff0c;建议去b站观看哈工大和王道考研的操作系统中虚拟存储相关章节&#xff0c;然后对于设计实现就游刃有余了。 …

C++数论————质数筛法(单独判断一个数,判断N个数) 埃氏筛法

质数想必大家都不陌生从小学到大质数的概念&#xff1a;一个数如果除了1和本身之外没有其他的因子&#xff0c;那么这个数被称为质数今天要讲两个知识点&#xff1a;在C中如何判断一个数是否为质数在C中如何判断1-N之间哪些数为整数在C中如何判断一个数是否为质数这个知识点较为…

当湖北《汉川》遇到湖南《早安隆回》,杨语莲会是下一个袁树雄吗

古有花木兰&#xff0c;替父去从军。如今在中国华语乐坛&#xff0c;继《早安隆回》袁树雄之后&#xff0c;又出现了《汉川》杨语莲。之所以把这两首歌曲&#xff0c;以及这两位音乐人&#xff0c;放在一起来做对比&#xff0c;是因为这两首歌曲&#xff0c;甚至这两位音乐人&a…

Java中weekOfYear和weekOfWeekBasedYear的区别

这其实是计算一年中的周数&#xff08;某日属于一年中的第几周&#xff09;的两种算法。 简单来说&#xff0c;前者保证了1周不会跨越自然年的边界&#xff1b;后者保证了1周一定有7天&#xff0c;一定从某个DayOfWeek&#xff08;如周一&#xff09;开始&#xff0c;并且1周只…

时序预测 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络时间序列预测 目录时序预测 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现GWO-BiLSTM灰狼算法优化双向长短…

每天花2小时恶补腾讯T8纯手打688页SSM框架和Redis,成功上岸美团

前言 我相信大家也都跟我一样&#xff0c;每天不是在加班就是在加班的路上&#xff0c;辛辛苦苦付出&#xff0c;可是得到的却不是很多。 这可能是大部分程序员的现状吧&#xff01;&#xff01; 最关键的是&#xff0c;整天都在CRUD、实现需求&#xff0c;真的想跟产品经理…

广发证券基于分布式架构的新一代估值系统实践

文 / 广发证券信息技术部 来源 / 金融电子化 随着信息技术应用创新试点范围不断扩大&#xff0c;能否胜任更多业务场景&#xff0c;是各行各业当前阶段选型数据库的关键。早在 2019 年&#xff0c;广发证券即开启对分布式架构的数据库产品进行调研&#xff0c;并经历了单主从读…

Git 提交模式

Git 对我们 Devs 的使用是必不可少的&#xff0c;无论是在个人项目中&#xff0c;还是在多人开源项目或整个社区中。鉴于此&#xff0c;正确使用 git commit很重要。拥有连贯和标准化的语言有助于参与项目的每个人理解已经发生的变化。在上图中&#xff0c;我们看到了评论不当的…

Camtasia2023简体中文版支持4K超清屏幕录屏

Camtasia 2023是TechSmith出品的一款屏幕录像和编辑的软件&#xff0c;可轻松录制和分享高质量的截屏视频&#xff0c;提供所需的工具和功能。功能强大的视频编辑器&#xff0c;通过记录您的屏幕活动和网络摄像头流&#xff0c;帮助您创建具有专业外观的截屏视频。软件提供了强…

“华为杯”研究生数学建模竞赛2005年-【华为杯】B题:空中加油问题的递推模型与调度策略

赛题描述 对飞行中的飞机进行空中加油,可以大大提高飞机的直航能力。为了简化问题,便于讨论,我们作如下假设。 少辅机架数两种情况给出你的作战方案。 论文 摘要 : 本文首先对空中加油问题进行了分析,提取了相关性质,在此基础上 建立了问题的递推模型。根据该模型,文…

使用DcokerCompose部署微服务项目详解

一、项目结构 我这里准备了一个微服务项目。 里面包含三个服务模块&#xff1a; card-service、use-rservice以及网关gateway。 一个公共模块&#xff1a; fegin-api。 其中fegin-api被card-service和user-service引用。 二、基于项目构建部署目录结构 这个springcloud-a…

电子档案备份相对于数据备份的特别之处

最近在和档案馆信息部门领导交流过程中&#xff0c;他们提出了一个很实际的困惑&#xff1a;《“十四五”全国档案事业发展规划》&#xff08;以下简称&#xff1a;《十四五规划》&#xff09;中明确提出了“电子档案备份中心”建设&#xff0c;并且要求“扎实做好档案数字资源…

检索业务:排序和价格区间及库存

排序 点击某个排序时首先按升序显示&#xff0c;再次点击再变为降序&#xff0c;并且还会显示上升或下降箭头 页面排序跳转的思路是通过点击某个按钮时会向其class属性添加/去除desc&#xff0c;并根据属性值进行url拼接 点击排序时 $(".sort_a").click(function () …

如何恢复回收站被清空的文件?你必须要知道的4种方法

电脑回收站里面有很多我们之前删除的文件&#xff0c;如果想要恢复这些文件&#xff0c;直接还原就可以了。但是回收站里面的数据被清空了怎么办&#xff1f;如何恢复回收站被清空的文件&#xff1f;接下来就给大家分享一些恢复回收站文件被删除的方法&#xff01; 方法一、使用…

AcWing 1068. 环形石子合并(环形区间DP)

AcWing 1068. 环形石子合并&#xff08;环形区间DP&#xff09;一、问题二、思路三、代码一、问题 二、思路 在讲解这道题之前&#xff0c;我们需要先掌握线性的区间DP问题&#xff0c;如果对于线性区间DP的解决方式还不了解的话&#xff0c;建议先看一下这篇文章&#xff1a;…

概论第7章_参数估计_点估计的评价标准_相合性_无偏性_有效性

点估计的评价标准包括&#xff1a; 相合性&#xff0c; 无偏性&#xff0c; 有效性。 一. 相合性 衡量一个估计是否可行的必要条件&#xff0c; 就是估计的相合性。 本文不提其定义了。直接给出一些结论。 结论 设有正态总体N(μ,σ2\mu, \sigma^2μ,σ2) 的样本&#xff0c;…

数据结构资料汇编:栈

数据结构资料汇编&#xff1a;栈 定义 栈&#xff08;stack&#xff09;是限定仅在表尾进行插入或删除操作的线性表。 表尾称为栈顶&#xff08;top&#xff09;&#xff0c;可以进行插入或删除操作 栈的插入操作称为进栈或入栈&#xff08;push&#xff09;栈的删除操作成为出…

Google Play 上的 Shady Reward 应用累积了 2000 万次下载

一种新的活动跟踪应用程序类别最近在 Android 的官方应用程序商店 Google Play 上取得了巨大成功&#xff0c;已在超过 2000 万台设备上下载。 这些应用程序将自己宣传为健康、计步器和养成良好习惯的应用程序&#xff0c;承诺为用户在日常生活中保持活跃、达到距离目标等提供…

字节青训前端笔记 | 跨端技术概述

本节课程内容会分为以下几个方面&#xff1a; 跨端是什么&#xff0c;给大家介绍跨端产生的背景及解决的问题跨端技术方案介绍&#xff0c;给大家介绍目前主流的跨端技术方案&#xff08;hybrid 方案/原生渲染方案/自渲染方案/小程序方案&#xff09;以及对比基于小程序跨端实…