【Qt开发流程】之TCP

news2024/11/27 8:27:50

概述

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输协议。它是互联网协议套件中的一部分,用于在网络上可靠地传输数据。
TCP通过建立连接、数据传输和连接终止三个阶段来进行通信。在建立连接阶段,客户端和服务器之间会进行握手,确认彼此的身份并建立一个可靠的连接。在数据传输阶段,数据会被分成小的数据包,每个数据包都包含序列号,接收方会根据序列号对数据包进行排序和重组,以确保数据的正确顺序和完整性。在连接终止阶段,连接会被关闭,释放资源。

TCP提供了可靠的数据传输服务,通过使用确认和重传机制来确保数据的准确性和完整性。它还支持流量控制和拥塞控制机制,以避免网络拥塞和数据丢失。TCP的连接是全双工的,意味着数据可以在两个方向上同时传输。

同时,TCP是一种面向连接的协议,这意味着在进行通信之前,客户端和服务器必须先进行握手建立连接。这种连接的特点是可靠性和顺序性,数据包会按照发送的顺序被接收方接收和处理。

在这里插入图片描述

QTcpSocket

QTcpSocket类提供一个TCP套接字。该类继承于QAbstractSocket。
QTcpSocket是异步进行工作的,通过发送信号来报告状态改变和错误信息,依靠事件循环来检测接收的数据。
可以使用QTcpSocket::write()方法写入数据,使用QTCPSocket::read()方法读取数据。
当从一个QTcpSocket中读取数据前,必须先调用QTcpSocket::bytesAvailable()函数来确保已有足够的数据可用。
如果要处理到来的TCP连接,需要使用到QTcpServer类。

QTcpServer

QTcpServer类提供了一个基于tcp的服务器。
这个类使得接受传入的TCP连接成为可能。可以指定端口,也可以让QTcpServer自动选择一个。可以监听一个特定的地址,也可以监听所有机器的地址。
调用listen()让服务器侦听传入的连接。然后,每次客户端连接到服务器时都会发出newConnection()信号。
调用nextPendingConnection()将挂起的连接作为已连接的QTcpSocket接受。该函数返回QAbstractSocket::ConnectedState中指向QTcpSocket的指针,可以使用该指针与客户端进行通信。
如果发生错误,serverError()返回错误的类型,并且可以调用errorString()来获得关于发生的错误描述。
当监听连接时,服务器正在监听的地址和端口可以作为serverAddress()和serverPort()使用。
调用close()使QTcpServer停止侦听传入的连接。
虽然QTcpServer主要是为与事件循环一起使用而设计的,但是不使用事件循环也可以使用它。在这种情况下,必须使用waitForNewConnection(),它会阻塞,直到连接可用或超时过期。

bool QTcpServer::waitForNewConnection(int msec = 0, bool *timedOut = Q_NULLPTR)
最多等待几毫秒,或者直到进入的连接可用为止。如果连接可用,则返回true;否则返回false。如果操作超时且timemedout不为0,则* timemedout将被设置为true。
这是一个阻塞函数调用。不建议在单线程GUI应用程序中使用它,因为整个应用程序将停止响应,直到函数返回。waitForNewConnection()在没有事件循环可用时非常有用。
非阻塞的替代方法是连接到newConnection()信号。
如果msec为-1,则该函数不会超时。

TCP 客户端和服务端连接流程

在这里插入图片描述

示例

先上UI
在这里插入图片描述
服务端监听,客户端连接,如果成功,服务端发送helloworld,客户端显示
server部分源码

    m_pServer = new QTcpServer(this);
    if(!m_pServer->listen(QHostAddress::LocalHost, 4567))
    {
        QMessageBox::information(this, "prompt", m_pServer->errorString());
        return;
    }
    connect(m_pServer, &QTcpServer::newConnection, this, &MainWindow::slot_sendMsg);
}
void MainWindow::slot_sendMsg()
{
    QByteArray ba("helloworld");

    QTcpSocket* m_pSocket = m_pServer->nextPendingConnection();
    connect(m_pSocket, &QTcpSocket::disconnected, m_pSocket, &QTcpSocket::deleteLater);
    m_pSocket->write(ba, ba.size());
    m_pSocket->disconnectFromHost();
    ui->plainTextEdit->appendPlainText(QString("发送数据 :%1").arg(QString(ba)));
}
  • 解释:
    首先创建一个Server对象,然后监听本地主机的4567端口,如果成功,就发射newConnection()信号
    client部分源码
    m_pSocket = new QTcpSocket(this);


    connect(m_pSocket, &QTcpSocket::readyRead, this, [=](){
        QString strInfo;
        strInfo = m_pSocket->readAll();
        ui->plainTextEdit->appendPlainText(strInfo);
    });
}

void MainWindow::on_toolButton_con_clicked()
{
    m_pSocket->abort();
    m_pSocket->connectToHost(ui->lineEdit->text(), ui->lineEdit_2->text().toShort());
}
  • 解释
    连接本地主机的4567端口,当有可读数据时,发送readyRead()信号。

使用场景

  1. 网页浏览:当用户在浏览器中请求网页时,使用HTTP协议进行通信,而HTTP通常基于TCP协议。TCP确保网页的可靠传输,确保网页内容的准确性和完整性。

  2. 文件传输:当用户需要通过网络传输文件时,常用的协议如FTP(文件传输协议)和SCP(Secure Copy)使用TCP协议。TCP可以确保文件的完整性和准确性。

  3. 电子邮件:SMTP(简单邮件传输协议)和POP3(邮局协议版本3)都使用TCP协议。TCP保证了邮件的可靠传输,以及邮件的正确接收和发送。

  4. 远程登录:如Telnet和SSH(安全外壳)协议使用TCP协议进行远程登录。TCP提供了稳定的连接,确保远程用户的输入和输出可以正确传输。

  5. 数据库访问:在数据库服务器和客户端之间进行数据的传输和交互时,使用TCP协议进行连接和通信。TCP保证了数据的完整性和可靠性。

结论

心有多大,舞台就有多大

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

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

相关文章

音频I2S

前言 基于网上资料对相关概念做整理汇总,部分内容引用自文后文章。 学习目标:简单了解相关概念、相关协议。 1 概述 数字音频接口DAI,即Digital Audio Interfaces,顾名思义,DAI表示在板级或板间传输数字音频信…

ELK(八)—Metricbeat部署

目录 介绍修改配置文件启动 Modulenginx开启状态查询配置Nginx module查看是否配置成功 介绍 Metricbeat 是一个轻量级的开源度量数据收集器,用于监控系统和服务。它由 Elastic 公司开发,并作为 Elastic Stack(Elasticsearch、Logstash、Kiba…

Ubuntu18.04安装ffmpeg

前言 从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_C…

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’ 文章目录 解决:AttributeError: module scipy.misc has no attribute imsave背景报错问题报错翻译报错位置代码报错原因解决方法方法一 scipy版本回退(不推荐&#…

【物联网】EMQX(二)——docker快速搭建EMQX 和 MQTTX客户端使用

一、前言 在上一篇文章中,小编向大家介绍了物联网必然会用到的消息服务器EMQ,相信大家也对EMQ有了一定的了解,那么接下来,小编从这篇文章正式开始展开对EMQ的学习教程,本章节来记录一下如何对EMQ进行安装。 二、使用…

P2P如何使用register_attention_control为UNet的CrossAttention关联AttentionStore

上次的调试到这里了,写完这篇接着看,prepare_latents_ddim_inverted 如何预计算 inversion latents: /home/pgao/yue/FateZero/video_diffusion/pipelines/p2p_ddim_spatial_temporal.py 1. 原始的UNet3D的CrossAttention和SparseCausalAtte…

展示一段比较简单的人工智能自动做模型的程序

人工智能是一种模拟或模仿人类智能的技术。它通过使计算机系统具有一定的认知能力和学习能力,使其能够自动完成一系列复杂的任务。人工智能可以在各个领域应用,包括图像识别、语音识别、自然语言处理、机器学习等。人工智能还可以用于解决各种问题&#…

地平线前端实习一面复盘(加深对var的理解+展开运算符+平拍数组)

目录 前言一,var的作用二,展开运算符三,平拍数组总结 前言 地平线的面试,有提示,很专业,体验很好。 可惜后面未收到消息,但还是要做复盘。收获还是很大的。 一,var的作用 且看下…

30. 深度学习进阶 - 池化

Hi,你好。我是茶桁。 上一节课,我们详细的学习了卷积的原理,在这个过程中给大家讲了一个比较重要的概念,叫做input channel,和output channel。 当然现在不需要直接去实现, 卷积的原理PyTorch、或者TensorFlow什么的…

Python tkinter 初探Toplevel控件搭建父子窗口

目录 Toplevel控件搭建父子窗口 最简明的父子窗口框架 改进一:屏蔽和开放按钮 改进二:子窗口始终在主窗口之上 改进三:增加子窗口的关闭协议 改进四:使子窗口长获焦点 总结 Toplevel控件搭建父子窗口 最近,用P…

直播江湖:东方甄选与董宇辉的权力游戏

出品| 大力财经 文 | 魏力 近期,围绕东方甄选的小作文事件引起了广泛关注,有人将其解读为一场巧妙策划的事件营销,然而,舆情的不可控性使得事态逐渐演变为一场复杂的利益博弈。 东方甄选与董宇辉的“蜜月期”可以说是双方互相成就…

【机器学习】梯度下降法:从底层手写实现线性回归

【机器学习】Building-Linear-Regression-from-Scratch 线性回归 Linear Regression0. 数据的导入与相关预处理0.工具函数1. 批量梯度下降法 Batch Gradient Descent2. 小批量梯度下降法 Mini Batch Gradient Descent(在批量方面进行了改进)3. 自适应梯度…

【Gradle】运行时一直要下载 gradle-8.5-bin.zip

如何解决 Downloading https://services.gradle.org/distributions/gradle-8.5-bin.zip 的问题 文章目录 1. 问题描述2. 解决方法1)找到 gradle-wrapper.properties2)修改 distributionUrl 对应的值 3. 验证 1. 问题描述 在执行 gradlew 命令的时候&…

SpringIOC之作用域Scope

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

Qt for Android设置安卓程序默认横屏+全屏

我的qt版本是5.14.1,网上查到的方法是,把编译出的build文件夹中的AndroidManifest.xml文件复制出来然后修改,然后把修改后的xml文件加入pro文件,语法为ANDROID_PACKAGE_SOURCE_DIR $$PWD/AndroidManifest.xml(具体&am…

喝酒中的酒文化

最近想感受一下不同酒的区别,所以搞了一些,国窖1573应该过两天就到了。 发现了一些比较好玩的事情。 一是要区别的话,确实得对比,对比起来还是相对比较明显的。 清香、浓香、酱香区别是挺大的。同一款酒低端和高端也确实有区别。…

数据分析为何要学统计学(10)——如何进行比率检验

比率检验是通过样本推测某种事件的总体占比水平。要求事件仅有互斥的两种情况,即,概率分别为p与1-p。 比率检验分单样本和双样本两种情况,以下我们分别介绍。 1. 单样本比率检验 形如这样的问题:“小学生近视比例日益提高&#…

[Android] ubuntu虚拟机上搭建 Waydroid 环境

1.安装虚拟机 略 2.安装waydroid Ubuntu/Debian and derivatives For Droidian and Ubuntu Touch, skip directly to the last step Install pre-requisites sudo apt install curl ca-certificates -y Add the official repository curl https://repo.waydro.id | sudo…

计算机网络:数据链路层(广域网、PPP协议、HDLC协议)

今天又学会了一个知识,加油! 目录 一、广域网 二、PPP协议 1、PPP协议应满足的要求 2、PPP协议无需满足的要求 3、PPP协议的三个组成部分 4、PPP协议的状态图 5、PPP协议的帧格式 三、HDLC协议 1、HDLC的站(主站、从站、复合站&…

87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验

瞬间爆火的Mixtral 8x7B 大家好,我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了,火爆程度压过Google的Gemini。 缘起是MistralAI二话不说,直接在其推特账号上甩出了一个87GB的种子 随后Mixtral公布了模型的一些细节&am…