QT中TCP的学习

news/2024/3/29 5:58:34/文章来源:https://blog.csdn.net/m0_60529319/article/details/130350936

文章目录

  • qt中TCP的实现

qt中TCP的实现

  • 学习视频

  • QT中可以通过TCP协议让服务器和客户端之间行通信。服务器和客户端的具体流程
    在这里插入图片描述

  • 下方的信号都是系统提供的,我们只需要写相应的槽函数

A、服务器:

  1. 创建QTcpServer对象
  2. 启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号)
  3. 当有客户端链接时候会发送newConnection()信号,触发自定义槽函数接受链接(使用nextPendingConnection() 与客户端建立连接,得到一个与客户端通信的套接字QTcpSocket)
  4. QTcpsocket发送数据用成员方法write
  5. 读数据当客户端有数据来,QTcpSocket对象就会发送readyRead()信号,触发自定义槽函数读取数据

B、客户端 :

  1. 创建QTcpSocket对象
  2. 链接服务器connectToHost(QHostAddress("ip"),端口号)
  3. QTcpsocket发送数据用成员方法write
  4. 读数据当对方有数据来,QTcpSocket对象就会发送readyRead()信号,触发自定义槽函数读取数据

直接上源码

  • 此代码在vs2017环境下写的
  • 会有详细注释,仔细阅读代码

先添加network模块
在这里插入图片描述
测试效果:
在这里插入图片描述
textSever.h

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_textSever.h"
#include <QTcpServer.h>
#include <QTcpSocket.h>class textSever : public QMainWindow
{Q_OBJECTpublic:textSever(QWidget *parent = nullptr);~textSever();signals:public slots:void new_connect();// 有新的连接void rev_mag();// 接收发送过来的消息void send_mag();// 发送消息private:Ui::textSeverClass ui;QTcpServer* severSocket;// 监听套接字QTcpSocket* clientSocket;// 通信套接字
};

textSever.cpp

#include "textSever.h"textSever::textSever(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);// 初始化 uiui.sIP->setText("127.0.0.1");ui.sPort->setText("9999");// 初始化套接字severSocket = new QTcpServer(this);// 监听套接字  监听本地severSocket->listen(QHostAddress(ui.sIP->text()), ui.sPort->text().toInt());// 当有新的连接的时候会触发 newConnection 信号connect(severSocket, &QTcpServer::newConnection, this, &textSever::new_connect);
}textSever::~textSever()
{}void textSever::new_connect() {// 有点像客户端的套接字 accept// 连接客户端clientSocket = severSocket->nextPendingConnection();// ui.record->append("有新的连接。。。。。");在vs中会有乱码ui.record->append(QString::fromLocal8Bit("有新的连接。。。。。"));// 当客户端有消息发送过来的时候,就会触发 readyRead 信号connect(clientSocket, &QTcpSocket::readyRead, this, &textSever::rev_mag);// 点击按钮,向客户端发送数据connect(ui.sendBtn, &QPushButton::clicked, this, &textSever::send_mag);
}void textSever::rev_mag()
{// 接收数据QByteArray array = clientSocket->readAll();ui.record->append(array);
}void textSever::send_mag()
{//发送数据clientSocket->write(ui.msg->toPlainText().toUtf8().data());ui.record->append("Me Say: " + ui.msg->toPlainText());// 清除发送框的消息ui.msg->clear();
}

textClient.h

#pragma once#include <QMainWindow>
#include "ui_textClient.h"
#include <QTcpSocket.h>
#include <QHostAddress.h>class textClient : public QMainWindow
{Q_OBJECTpublic:textClient(QWidget *parent = nullptr);~textClient();signals:public slots:void rev_mag();// 接收发送过来的消息void send_mag();// 发送消息private:Ui::textClientClass ui;QTcpSocket* clientSocket;
};

textClient.cpp

#include "textClient.h"textClient::textClient(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);//初始化clientSocket = new QTcpSocket(this);// 初始化 uiui.sIP->setText("127.0.0.1");ui.sPort->setText("9999");//连接服务器  这个是非阻塞方式,连接不上也不管clientSocket->connectToHost(QHostAddress(ui.sIP->text()), ui.sPort->text().toInt());// 接收数据connect(clientSocket, &QTcpSocket::readyRead, this, &textClient::rev_mag);// 发送数据connect(ui.sendBtn, &QPushButton::clicked, this, &textClient::send_mag);}textClient::~textClient()
{}void textClient::rev_mag()
{QByteArray array = clientSocket->readAll();ui.record->append(array);
}void textClient::send_mag()
{clientSocket->write(ui.msg->toPlainText().toUtf8().data());ui.record->append("my say :" + ui.msg->toPlainText());ui.msg->clear();
}

main.cpp

#include "textSever.h"
#include "textClient.h"
#include <QtWidgets/QApplication>int main(int argc, char *argv[])
{//对于按钮文字显示不全的解决方法,必须放在main中的第一行QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QApplication a(argc, argv);textSever w;w.setWindowTitle(QString::fromLocal8Bit("服务器"));w.show();textClient c;c.setWindowTitle(QString::fromLocal8Bit("客户端"));c.show();return a.exec();
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】指针进阶[上] (字符、数组指针、指针数组、数组传参和指针传参)

简单不先于复杂&#xff0c;而是在复杂之后。 目录 1. 字符指针 面试题 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名 VS 数组名 3.3 数组指针的使用 4. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二…

后端大厂面试总结大全六

目录&#xff1a; 1、Transactional注解控制事务有哪些不生效的场景2、MySQL的优化 1、Transactional注解控制事务有哪些不生效的场景 数据库引擎不支持事务数据源没有配置事务管理器没有被spring管理方法不是public的同一个类中方法调用&#xff0c;导致Transactional失效 举…

操作系统原理 —— 进程状态切换具体做了哪些事情?(八)

什么是进程控制&#xff1f; 进程控制的主要功能是&#xff1a;对系统中的所有进程实施有效的管理&#xff0c;它具有创建新进程、撤销已有进程、实现进程状态转换等功能。 简单来说&#xff0c;就是进程控制就是要现实进程状态的转换。 那如何实现进程的控制呢&#xff1f;…

手推FlinkML2.2(一)

Java 快速入门 # 本文档提供了一个关于如何使用Flink ML的快速入门。阅读本文档的用户将被指导提交一个简单的Flink作业&#xff0c;用于训练机器学习模型并提供预测服务。 求助&#xff0c;我卡住了&#xff01;# 如果你遇到困难&#xff0c;请查看社区支持资源。特别是&…

Java线程间通信方式

前文了解了线程的创建方式和状态切换&#xff0c;在实际开发时&#xff0c;一个进程中往往有很多个线程&#xff0c;大多数线程之间往往不是绝对独立的&#xff0c;比如说我们需要将A和B 两个线程的执行结果收集在一起然后显示在界面上&#xff0c;又或者比较典型的消费者-生产…

【论文写作】如何写引言?应该思考什么问题?总体架构!!!

结构 大多数的科技论文都聚焦于简单地说明&#xff0c;做了什么&#xff0c;发现了什么&#xff1f;虽然这个可以帮助你写出一篇研究型论文当中的核心的东西&#xff08;方法论和结果&#xff09;&#xff0c;但是不能完全把引言的部分完成。在这篇文章当中&#xff0c;将展示…

4 redis高可用

所谓的高可用&#xff0c;也叫HA&#xff08;High Availability&#xff09;&#xff0c;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。如果在实际生产中&#xff0c;如果redis只部署一个节点&#xff0c;…

从FMCW毫米波雷达系统的性能参数理解4D成像毫米波雷达的设计思路

本文编辑&#xff1a;调皮哥的小助理 站在设计雷达的角度看&#xff0c;其实无论是传统的3D毫米波雷达&#xff0c;还是如今的4D毫米波成像雷达&#xff0c;其雷达系统性能参数都遵循一个原则&#xff0c;即&#xff1a; d res ⋅ v res ⋅ θ res d max ⁡ ⋅ v max ⁡ ⋅ …

ESP8266通过MQTT协议连接onenet云平台

中国移动onenet平台 文章目录 中国移动onenet平台前言一、onenet平台二、ESP82661.完整代码2.联网代码3.连云代码4.数据处理 总结 前言 最近在弄onenet平台&#xff0c;用arduino结合esp8266&#xff0c;就是不知道怎么回事&#xff0c;一直连不上wifi&#xff0c;然后就用esp…

Linux下使用Mysql 第一天

目录 安装mysql 更改账户名和密码 启动/关闭mysql mysql的基本操作 数据库CURD 创建数据库 查看数据库 修改数据库 删除数据库 表的CURD 创建表 查看表 修改表 删除表 表数据的CURD create数据 Retrieve数据 update数据 delete数据 DML和DDL的区别&#xf…

高分辨率光学遥感图像水体分类综述2022.03

本文是Water body classification from high-resolution optical remote sensing imagery: Achievements and perspectives的学习笔记。 相关资源被作者整理到&#xff1a;这里 文章目录 Introduction基本知识 挑战和机遇挑战1. 有限的光谱信息和小场景覆盖2. 形状、大小和分布…

【JAVA-模块五 数组】

JAVA-模块五 数组 一、数组&#xff08;一维&#xff09;1.1数组是什么&#xff1f;1.2java中数组静态初始化&#xff1a;&#xff08;存&#xff09;两种定义格式&#xff1a;数组初始化格式&#xff1a;静态初始化后&#xff0c;打印数组名&#xff1a; 1.3 数组元素访问&…

javaweb学生在线考试系统dzkf10程序

打分&#xff09;、系统管理&#xff08;数据备份&#xff09;等功能操作。 以学生的身份在登录页面输入账号和密码&#xff0c;经过数据库身份验证&#xff0c;验证成功后登录系统主页&#xff0c;可以使用个人资料管理、试卷查看、在线考试、在线答疑、个人考试成绩查询等功能…

Oracle的学习心得和知识总结(二十三)|Oracle数据库Real Application Testing之Database Replay相关视图

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

LVS负载均衡-DR

1.DR模式中每台主机都有一个VIP地址 虚拟网址放在lo网卡上&#xff08;回环网卡&#xff09; arp_ignore1 Arp_announce2 系统不使用IP包的源地址来设置ARP请求的源地址&#xff0c;而选择发送接口的IP地址 2.内核参数修改 3.vim /etc/rc.conf 开机自启动 Chmod x /etc/rc.d…

【翻译一下官方文档】之uniapp的导航条设置

目录 uni.setNavigationBarTitle(OBJECT) uni.setNavigationBarColor(OBJECT) uni.hideHomeButton(OBJECT) uni.setNavigationBarTitle(OBJECT) 动态设置当前页面的标题。 OBJECT参数说明 参数类型必填说明titleString是页面标题successFunction否接口调用成功的回调函数fai…

卷积神经网络总结

1、卷积核 进行互相关运算。 卷积核的大小一般是奇数。 卷积核的本质类似于提取局部特征&#xff08;过滤器&#xff09;&#xff0c;当层层卷积核叠加后&#xff0c;卷积核的感受野变大&#xff0c;卷积核的作用逐渐向提取全局抽象特征靠近。最后一层的神经元应该对整个输入…

SpringBoot中@EnableAsync和@Async注解的使用

目录 1.EnableAsync 注解1.1 配置类使用示例1.2 复制请求上下文 2.用法1&#xff1a;Async 注解2.1 测试Controller2.2 测试Service2.3 测试ServiceImpl2.4.测试 4.用法2&#xff1a;直接使用 taskExecutor 做异步4.1 重新实现&#xff1a;测试ServiceImpl4.2 测试 5.Async异步…

ArcGIS三体阴影(影像三维)显示马赛克?

我们经常基于ArcGIS通过DEM来做山体阴影 但是有时候你一放大就会出现很强的马赛克的效果 还有我们在利用ArcScene建三维场景 即使数据分辨率很高也会出现马赛克效果 那怎么来解决这个问题呢 让我们的山体阴影显示更加细腻 三维没有马赛克的效果呢&#xff1f; 右键图层选择如…

地铁站人流检测硬件部分

目录 一、概述 二、驱动程序 2.1debug串口 2.2体重传感器HX711 2.3滴答定时器 2.4ESP8266 2.5人体检测 2.6 IIC的GPIO 2.7 OLED的IIC 2.8 LED 三、应用 四、中断 一、概述 使用STM32C8T6作为主控 A9 ---> tx&#xff08;调试串口&#xff09; A10 ---> …