qt学习 tcp实现 c++

news2024/12/23 8:20:18

这里写目录标题

  • qt网络编程
  • qt下的TCP 编程
    • 设计ui界面
    • 监听
    • 关闭和发送
    • 调试 查找网络调试助手,用助手当客户端测试 编写的服务端
    • newConnection()
    • newConnection_Slot()
  • Tcp Client
    • 界面设计
    • 代码部分1
    • 关闭客户端
    • 发送客户端
    • 整体
    • 疑惑

https://www.bilibili.com/video/BV1tp4y1i7EJ/?p=13&spm_id_from=pageDriver&vd_source=e7d12c9f66ab8294c87125a95510dac9

qt网络编程

网络编程有tcp和udp

qt下的TCP 编程

TCP编程两个类: QTcpserver qtcpSocket
在这里插入图片描述
要包含的头文件
qmake表示 pro文件中要添加的内容
在这里插入图片描述
头文件里声明相应 public成员 属性
在这里插入图片描述
cpp文件中
在这里插入图片描述

设计ui界面

在这里插入图片描述
接收框设置为 只读
相应的对象重命名
在这里插入图片描述

监听

位于tcpserver中,listen函数

在widget cpp文件中

tcpServer->listen() 开启监听,监听来自所有人的连接,端口号来自ui界面中设计的内容


tcpsocket = tcpserver->nextpendingconnection(); 用这个函数获得已经连接的客户端的socket,从而可以读 和 写

查找有关信号




在这里插入图片描述

在这里插入图片描述

在 openBt_clicked()函数中

tcpServer->listen(xxxxxxxxxxxxxx toUInt) 开启监听

关闭和发送

在这里插入图片描述

调试 查找网络调试助手,用助手当客户端测试 编写的服务端

newConnection()

newConnection() 是 Qt 中 QTcpServer 类的一个信号,它在有新的客户端连接到服务器时被触发。当 QTcpServer 监听的套接字(Socket)接收到新的连接请求时,就会发出 newConnection() 信号,用来通知应用程序有新的连接已经建立,并且可以通过调用 nextPendingConnection() 函数获取到对应的 QTcpSocket 对象,用于进行数据的收发。

下面是一个使用 QTcpServer 的例子,演示了如何处理 newConnection() 信号:

// 创建并监听 QTcpServer 对象
QTcpServer *tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::Any, port);

// 连接 newConnection() 信号
connect(tcpServer, &QTcpServer::newConnection, this, &MyServer::onNewConnection);

// 处理新连接函数
void MyServer::onNewConnection()
{
    QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
    // 处理新的客户端连接
}

在上述代码中,创建了一个 QTcpServer 对象 tcpServer,并监听指定的端口。然后,通过 connect() 函数连接 newConnection() 信号和处理函数 onNewConnection(),当有新的客户端连接请求时, onNewConnection() 函数就会被执行,并通过 nextPendingConnection() 函数获取到对应的客户端 QTcpSocket 对象,用于进行数据的收发处理。

newConnection_Slot()

newConnection_Slot() 不是 Qt 中内置的函数或信号槽,它可能是某个应用程序中自定义的槽函数,用来处理 QTcpServer::newConnection() 信号的连接事件。

例如,在使用 QTcpServer 搭建一个简单的 TCP 服务器时,可能需要自定义一个槽函数 newConnection_Slot() 来处理新连接事件,示例如下:

// 创建并监听 QTcpServer 对象
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::Any, port);

// 连接 newConnection() 信号和槽函数
connect(tcpServer, &QTcpServer::newConnection, this, &MyServer::newConnection_Slot);

// 处理新连接事件
void MyServer::newConnection_Slot()
{
    // 获取新连接的 QTcpSocket 对象
    QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
    
    // 将新客户端的请求发送给处理函数 ClientMsgHandler,该函数可以根据协议处理收到的数据
    connect(clientSocket, &QTcpSocket::readyRead, this, &MyServer::ClientMsgHandler);
    
    // 将客户端断开连接的信号与处理函数 DisconnectedHandler 连接起来,当客户端断开连接时触发该函数
    connect(clientSocket, &QTcpSocket::disconnected, this, &MyServer::DisconnectedHandler);
}

在上述代码中,newConnection_Slot() 为自定义的槽函数,用来处理新连接事件。当有新的客户端连接请求时,该函数将通过 nextPendingConnection() 函数获取到对应的 QTcpSocket 对象,并通过 connect() 函数将其收到的数据发送给处理函数 ClientMsgHandler() 进行协议处理。此外,还将客户端断开连接的信号与处理函数 DisconnectedHandler() 连接起来,当客户端断开连接时触发该函数进行对应的操作。

Tcp Client

在这里插入图片描述
在这里插入图片描述

界面设计

在这里插入图片描述

代码部分1

在 widget h文件中定义qtcpSocket对象,然后再cpp构造函数中构建 new tcpscoket

在这里插入图片描述
打开客户端按钮 右键转到槽、
在这里插入图片描述
实现槽函数
在这里插入图片描述

关闭客户端

在这里插入图片描述

发送客户端

在这里插入图片描述

整体

在这里插入图片描述
最后一行代码 缺少 .data()

在这里插入图片描述

疑惑

他有一个地方SLOT() 里没有

connect() 函数中,如果信号的发送者和接收者之间的槽函数返回值不同,或者参数不匹配,都会导致编译错误。因此,在使用 connect() 函数时,SLOT 中必须填入与信号匹配的槽函数。如果没有填写槽函数,程序将无法编译通过。

readyRead() 信号被触发时,它会自动调用与之连接的槽函数进行处理。因此,在使用 connect() 函数连接 readyRead() 信号和对应的槽函数时,必须在 SLOT 中填写与信号匹配的槽函数名字。

例如,下面是一个示例代码,演示了如何使用 connect() 函数连接 QTcpSocketreadyRead() 信号和槽函数:

// 连接 readyRead() 信号和 readMessage() 槽函数
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));

// 处理新的消息函数
void MyClient::readMessage()
{
    // 读取从服务器发来的数据
    QByteArray msg = tcpSocket->readAll();
    
    // 处理收到的数据
    // ...
}

在上述代码中,使用 connect() 函数连接 tcpSocketreadyRead() 信号和处理函数 readMessage(),当收到数据时,readMessage() 函数会被自动调用进行数据处理。如果 SLOT 中没有填写 readMessage() 函数名,程序将无法通过编译。

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

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

相关文章

Android CMake

首先了解几个名词 NDK The Android Native Development Kit The Android NDK is a toolset that lets you implement parts of your app in native code, using languages such as C and C. For certain types of apps, this can help you reuse code libraries written in t…

虚实相生的元宇宙,不仅仅是在做虚拟社交?

互联网迭代速度已经超出了人们的想象,从Web1.0到Web 2.0,以及紧随其后的 Web 3.0。 不管我们愿不愿意承认,元宇宙的时代已经真真切切地到来了,它的兴起也是社会发展到一定阶段的必然现象。随着时代的发展,如今创作者的…

OpenWrt uci网络配置详解

配置文件 OpenWrt所有配置保存在/etc/config目录,以下为主要的网络配置文件 网络接口配置 /etc/config/network网络服务配置 /etc/config/dhcp防火墙配置 /etc/config/firewall 网络接口 OpenWrt网络接口一般包含lan口和wan口,但如果是X86等设备&…

十五.EtherCAT开发之对象字典的映射原理

十五.EtherCAT开发之对象字典的映射原理 15.1 协议栈文件含义 仔细阅读四个代码文件 l 文件el9800appl.c:主函数,数据收发函数所在 l 文件el9800appl.h:对象字典定义所在,包含对象字典的类型、权限、长度、映射关系、链接变量…

Restful风格笔记

Restful风格知识点 RestController注解 在类上添加RestController可以默认类中的所有方法都带有ResponseBody注解,可以省去一个个添加的麻烦。 RestController RequestMapping("/restful") //CrossOrigin(origins {"http://localhost:8080"…

第六节 元组、字典

文章目录 掌握知识点1. 元组1.1 元组概述1.2 语法格式1.3 元组场景使用 2. 字典2.1 概述2.2 字典的语法结构与注意2.3 字典CURD2.3.1 字典获取2.3.2 字典添加和修改2.3.3 字典删除2.3.4 字典遍历 2.4 enumerate 函数2.5 扩展练习2.5.1 判断是否能全部购买2.5.2 学生信息的排序2…

图像中的脸部、四肢问题及其解决方法

在SD绘图的时候经常会出现多个头部、多个身体部位或者多个手指的问题这里介绍一些通用的简单的解决办法。 文章目录 多个人物或者部位没有全身出境使用纵向尺寸脸部乱码和眼睛问题人物手指乱问题 多个人物或者部位 绘图基本信息 正面词 <lora:DynastyWarriors_wu_cloth:1…

若依框架学习

1.若依&#xff08;前后端分离版&#xff09; 1.1什么是若依 开源项目&#xff0c;学习开源项目的目的&#xff1a; 1.用别人的&#xff0c;减少自己的工作量 2.学习他的底层编程思想&#xff0c;设计思路&#xff0c;提高自己的编程能力 官网&#xff1a;www.ruoyi.vip …

“AI+RPA+数据+机器人”:深入解析“数字员工”的内涵和价值

世界正进入数字经济快速发展的时期。 2021年12月&#xff0c;中央网络安全和信息化委员会印发《“十四五”国家信息化规划》&#xff0c;提出加快建设数字中国&#xff0c;大力发展数字经济的总体目标&#xff1b;2022年1月&#xff0c;央行印发《金融科技发展规划&#xff08…

第十章 番外篇:DDP

参考教程&#xff1a; what is DDP pytorch distributed overview 文章目录 DDP介绍什么是DDPDistributedSampler()DistributedDataParallel() 使用DDP代码示例multiprocessing.spawn()save and load checkpoints DDP介绍 什么是DDP DDP的全称是DistributedDataParallel&…

Qt控件学习

目录 QPushButton QToolButton QRadioButton QCheckBox QPushButton MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);ui->n1->setText("我的世界");ui->n1->setIcon(QIcon(":/111…

异构广告混排在美团到店业务的探索与实践

转子&#xff1a;https://tech.meituan.com/2022/03/10/exploration-and-practice-of-heterogeneous-ad-mixed-ranking-in-meituan-ads.html 1 背景与简介 1.1 背景 美团到店广告负责美团搜索流量的商业变现&#xff0c;服务于到店餐饮、休娱亲子、丽人医美、酒店旅游等众多…

文言一心,ChatGLM-6B和ChatGPT等模型概述

原文首发于博客文章大语言模型概况 定义 &#xff08;个人理解的&#xff09;大语言模型&#xff08;Large Language Model&#xff09;是一种基于深度学习技术的自然语言处理通用模型&#xff0c;它可以通过学习大规模文本数据的模式和规律&#xff0c;从而实现对自然语言的理…

【面试】你知道数据库能抗多大并发压力吗?

文章目录 前言一、一般业务系统运行流程图二、一台4核8G的机器能扛多少并发量呢&#xff1f;三、高并发来袭时数据库会先被打死吗&#xff1f;四、数据库架构可以从哪些方面优化&#xff1f;4.1、根据业务系统拆分多个数据库机器优化方案4.2、读写分离架构优化方案4.3、分库分表…

华为手表上架(1)HarmonyOS应用 打包 .app

华为手表上架&#xff08;1&#xff09;HarmonyOS应用 打包 .app 初环境与设备先找到配置项目结构的地方&#xff1a; Project Structure配置证书打包 .app 在本文中&#xff0c;我们介绍探讨华为手表上架的流程&#xff0c;并重点介绍HarmonyOS应用的打包过程。了解如何将应用…

locust学习教程(5) - 分布式执行

目录 前言 1、基础 2、操作步骤 2.1、启动主节点 2.2、启动从节点 2.2.1、启动自己电脑的从节点 2.2.2、启动同事电脑的从节点 2.3、开始并发 3、无web界面&#xff0c;定时运行&#xff0c;数据存储在csv中、等待4个节点连接后自动开始 4、有web界面&#xff0c;定时运…

5年测试老鸟整理,企业自动化测试经验,不要再走弯路了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 2023年&#xff0…

vue-antdesign——实现table单元格合并+换行展示+滚动到指定位置+行样式设置——技能提升

最近在写后台管理系统&#xff0c;遇到一个需求&#xff0c;就是要实现表格table组件的合并单元格&#xff0c;并实现编辑等功能。 效果图如下&#xff1a; 下面做一下记录&#xff1a; 1.表格table组件实现单元格合并 之前写过一篇文章关于单元格合并的功能&#xff0c;这…

倒谱和同态去卷积

本文首发于算法社区&#xff0c;转载请注明出处&#xff0c;谢谢。 前言 倒谱的内容比较少&#xff0c;比较相关的就是同态系统去卷积了&#xff0c;所以把这两个放在一起了。 倒谱 我们考虑一个具有 z z z 变换的序列 { x n } \left \{ x_{n} \right \} {xn​} 。我们假设…

Elasticsearch(十一)搜索---搜索匹配功能②--range查询和exists查询

一、前言 继上一节学习了ES的搜索的查询全部和term搜索后&#xff0c;此节将把搜索匹配功能剩余的2个学习完&#xff0c;分别是range搜索和exists搜索 二、range范围搜索 range查询用于范围查询&#xff0c;一般是对数值型和日期型数据的查询。使用range进行范围查询时&…