Qt TCP网络上位机的设计(通过网络编程与下位机结合)

目录

TCP 协议基础

QTcpServer 和 QAbstractSocket 主要接口函数

TCP 应用程序

1.服务端

2.客户端

上位机通过网络编程与下位机实现通信


TCP 协议基础

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议

TCP 的拥塞控制算法(也称 AIMD 算法)。该算法主要包括四个主要部分:慢启动、拥塞避免、快速重传和快速恢复

TCP 通信必须建立 TCP 连接(客户端和服务器端),Qt 提供 QTcpSocket 类和 QTcpServer 类专门用于建立 TCP 通信程序。服务 器端用 QTcpServer 监听端口及建立服务器;QTcpSocket 用于建立 连接后使用套接字(socket)进行通信

QTcpServer 和 QAbstractSocket 主要接口函数

QTcpServer 是从 QOjbect 继承的类用于服务器建立网络监听, 创建网络 socket 连接。QTcpServer 主要接口函数如下:

QAbstractSocket主要接口函数如下:

TCP 应用程序

1.服务端

UI绘图:

代码示例:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>#include <QTcpServer> // 专门用于建立TCP连接并传输数据信息
#include <QtNetwork> // 此模块提供开发TCP/IP客户端和服务器的类QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;// 自定义如下
private:QTcpServer *tcpserver; //TCP服务器QTcpSocket *tcpsocket;// TCP通讯socketQString GetLocalIpAddress(); // 获取本机的IP地址private slots:void clientconnect();void clientdisconnect();void socketreaddata();void newconnection();void on_pushButton_Start_clicked();void on_pushButton_Stop_clicked();void on_pushButton_Send_clicked();protected:void closeEvent(QCloseEvent *event);};
#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QMessageBox>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QString strip=GetLocalIpAddress();// QMessageBox::information(this,"数据",strip,QMessageBox::Yes);ui->comboBoxIp->addItem(strip);tcpserver=new QTcpServer(this);connect(tcpserver,SIGNAL(newConnection()),this,SLOT(newconnection()));}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_Start_clicked()
{QString ip=ui->comboBoxIp->currentText();quint16 port=ui->spinBoxPort->value();QHostAddress address(ip);tcpserver->listen(address,port);ui->plainTextEdit_DispMsg->appendPlainText("$$$$$$$$$$开始监听$$$$$$$$$$");ui->plainTextEdit_DispMsg->appendPlainText("$$$$$$$$$$服务器地址$$$$$$$$$$:"+tcpserver->serverAddress().toString());ui->plainTextEdit_DispMsg->appendPlainText("$$$$$$$$$$服务器端口$$$$$$$$$$:"+QString::number(tcpserver->serverPort()));ui->pushButton_Start->setEnabled(false);ui->pushButton_Stop->setEnabled(true);}void MainWindow::on_pushButton_Stop_clicked()
{if(tcpserver->isListening()){tcpserver->close();ui->pushButton_Start->setEnabled(true);ui->pushButton_Stop->setEnabled(false);}}void MainWindow::on_pushButton_Send_clicked()
{QString strmsg=ui->lineEdit_InputMsg->text();ui->plainTextEdit_DispMsg->appendPlainText("[out]:"+strmsg);ui->lineEdit_InputMsg->clear();QByteArray str=strmsg.toUtf8();str.append("\n");tcpsocket->write(str);
}QString MainWindow::GetLocalIpAddress() // 获取本机的IP地址
{QString hostname=QHostInfo::localHostName();QHostInfo hostinfo=QHostInfo::fromName(hostname);QString localip="";QList<QHostAddress> addresslist=hostinfo.addresses();if(!addresslist.isEmpty()){for (int i=0;i<addresslist.count();i++){QHostAddress addrhost=addresslist.at(i);if(QAbstractSocket::IPv4Protocol==addrhost.protocol()){localip=addrhost.toString();break;}}}return localip;
}void MainWindow::clientconnect()
{// 客户端连接ui->plainTextEdit_DispMsg->appendPlainText("**********客户端socket连接**********");ui->plainTextEdit_DispMsg->appendPlainText("**********peer address:"+tcpsocket->peerAddress().toString());ui->plainTextEdit_DispMsg->appendPlainText("**********peer port:"+QString::number(tcpsocket->peerPort()));}void MainWindow::clientdisconnect()
{// 客户端断开连接ui->plainTextEdit_DispMsg->appendPlainText("**********客户端socket断开连接**********");tcpsocket->deleteLater();}void MainWindow::socketreaddata()
{// 读取数据while(tcpsocket->canReadLine())ui->plainTextEdit_DispMsg->appendPlainText("[in]"+tcpsocket->readLine());}void MainWindow::newconnection()
{tcpsocket=tcpserver->nextPendingConnection();connect(tcpsocket,SIGNAL(connected()),this,SLOT(clientconnect()));clientconnect();connect(tcpsocket,SIGNAL(disconnected()),this,SLOT(clientdisconnect()));connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(socketreaddata()));connect(tcpsocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(OnSocketStateChanged(QAbstractSocket::SocketState)));}void MainWindow::closeEvent(QCloseEvent *event)
{if(tcpserver->isListening())tcpserver->close();event->accept();
}

2.客户端

UI绘图:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>#include <QTcpSocket>
#include <QHostAddress>
#include <QHostInfo>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;private:QTcpSocket *tcpclient; // 客户端tcpclientQString getlocalip(); // 获取本机IP地址protected:void closeEvent(QCloseEvent *event);private slots:void connectfunc();void disconnectfunc();void socketreaddata();void on_pushButton_Connect_clicked();void on_pushButton_Send_clicked();void on_pushButton_Disconnect_clicked();
};
#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);tcpclient=new QTcpSocket(this);QString strip=getlocalip();ui->comboBoxIp->addItem(strip);connect(tcpclient,SIGNAL(connected()),this,SLOT(connectfunc()));connect(tcpclient,SIGNAL(disconnected()),this,SLOT(disconnectfunc()));connect(tcpclient,SIGNAL(readyRead()),this,SLOT(socketreaddata()));}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_Connect_clicked()
{QString addr=ui->comboBoxIp->currentText();quint16 port=ui->spinBoxPort->value();tcpclient->connectToHost(addr,port);
}void MainWindow::on_pushButton_Send_clicked()
{QString strmsg=ui->lineEdit_InputMsg->text();ui->plainTextEdit_DispMsg->appendPlainText("[out]:"+strmsg);ui->lineEdit_InputMsg->clear();QByteArray str=strmsg.toUtf8();str.append('\n');tcpclient->write(str);}void MainWindow::on_pushButton_Disconnect_clicked()
{if(tcpclient->state()==QAbstractSocket::ConnectedState)tcpclient->disconnectFromHost();
}QString MainWindow::getlocalip() // 获取本机IP地址
{QString hostname=QHostInfo::localHostName();QHostInfo hostinfo=QHostInfo::fromName(hostname);QString localip="";QList<QHostAddress> addlist=hostinfo.addresses();if(!addlist.isEmpty()){for (int i=0;i<addlist.count();i++){QHostAddress ahost=addlist.at(i);if(QAbstractSocket::IPv4Protocol==ahost.protocol()){localip=ahost.toString();break;}}}return localip;
}void MainWindow::closeEvent(QCloseEvent *event)
{if(tcpclient->state()==QAbstractSocket::ConnectedState){tcpclient->disconnectFromHost();}event->accept();}void MainWindow::connectfunc()
{ui->plainTextEdit_DispMsg->appendPlainText("**********已经连接到服务器端**********");ui->plainTextEdit_DispMsg->appendPlainText("**********peer address:"+tcpclient->peerAddress().toString());ui->plainTextEdit_DispMsg->appendPlainText("**********peer port:"+QString::number(tcpclient->peerPort()));ui->pushButton_Connect->setEnabled(false);ui->pushButton_Disconnect->setEnabled(true);}
void MainWindow::disconnectfunc()
{ui->plainTextEdit_DispMsg->appendPlainText("**********已断开与服务器端的连接**********");ui->pushButton_Connect->setEnabled(true);ui->pushButton_Disconnect->setEnabled(false);}
void MainWindow::socketreaddata()
{while(tcpclient->canReadLine())ui->plainTextEdit_DispMsg->appendPlainText("[in]:"+tcpclient->readLine());}

上位机通过网络编程与下位机实现通信

Qt作为上位机

51、32单片机或ARM开发板开作为下位机

通过网络编程实现通信

上位机可作为服务端或客户端,下位机也可作为服务端或客户端,具体按各自的项目需求实现

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

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

相关文章

mysql从库设置为只读

直奔主题&#xff0c;mysql设置为只读后&#xff0c;无法增删改。 设置命令&#xff1a; mysql> set global read_only1; #1是只读&#xff0c;0是读写 mysql> show global variables like %read_only%; 以下是相关说明&#xff1a; 1、对于数据库读写状态&#xf…

详解RT-DETR网络结构/数据集获取/环境搭建/训练/推理/验证/导出/部署

论文地址&#xff1a;RT-DETR论文地址 代码地址&#xff1a;RT-DETR官方下载地址 目录 一、本文介绍 二、RT-DETR的网络结构 2.1、模型概览 2.2、高效混合编码器 2.3、IoU感知查询选择 2.4、 可扩展的RT-DETR 三、RT-DERT的环境搭建 四、免费数据集获取 五、获取RT-D…

Linux基本命令一

Linux基本命令一 1、mkdir 命令 mkdir ​ **作用&#xff1a;**命令用来创建指定的名称的目录&#xff0c;要求创建目录的用户在当前目录中具有写权限&#xff0c;并且指定的目录名不能是当前目录中已有的目录 ​ **语法&#xff1a;**mkdir [选项] 目录 ​ **命令功能&am…

【Android知识笔记】性能优化专题(三)

App 布局优化 绘制原理 CPU 负责计算显示内容GPU 负责栅格化(UI元素绘制到屏幕上)每 16ms 发出 VSync 信号触发 UI 渲染,代码必须保证在16ms内绘制完毕大多数的Android设备屏幕刷新频率:60Hz(人眼分辨的极限)大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性…

爬楼梯(力扣LeetCode)动态规划

爬楼梯 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示…

使用python 实现华为设备的SFTP文件传输

实验目的&#xff1a; 公司有一台CE12800的设备&#xff0c;管理地址位172.16.1.2&#xff0c;现在需要编写自动化脚本&#xff0c;通过SFTP实现简单的上传下载操作。 实验拓扑&#xff1a; 实验步骤&#xff1a; 步骤1&#xff1a;将本地电脑和ensp的设备进行桥接&#xff…

菜单的hover不同动画背景

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

SWT/Jface(3): 表格中添加超链接

背景 实际业务中经常需要展示某个网站, 并且希望在展示的时候单击网站可直接访问, 本节演示在表格中如何添加超链接支持. 需求 假设我需要渲染一个Study类, 它只有三个属性id,name和website, 其中id只支持展示, name只支持编辑, 而website只支持单击时跳转到相应的网站, 效果…

Java面试准备

计算密集型&#xff1a;这一类主要是在线程中&#xff0c;按照数学公式&#xff0c;大量求和、求平均、求平方等等操作&#xff0c;这样的任务&#xff0c;大部分需要依赖CPU的计算能力来处理&#xff0c;我们设置线程数一般是&#xff1a;计算机核数n1。 IO密集型&#xff1a;…

Linux7设置ssh秘钥登录并关闭密码登录

说明&#xff1a;场景为windows使用WinScp远程登录linux服务 winscp安装教程&#xff1a;winscp安装及关联putty使用_putty.exe没有找到_cherishSpring的博客-CSDN博客 1.在window上生成公钥和秘钥&#xff0c;操作方式参考以下文章第3点&#xff1a; git关联云效使用教程_云…

【Excel导入】- EasyExcel读取Excel空数据行问题

EasyExcel读取Excel空数据行问题 原因解决写在最后 原因 项目Excel导入使用的EasyExcel工具&#xff0c;为什么会出现空白行的问题呢&#xff1b;在进行Excel导入时都会提前设定一个Excel模版&#xff0c;Excel导入时在Excel模版中设置了单元的样式&#xff0c;但没有给单元格…

Ps:使用钢笔工具绘制自由路径的技巧

只有熟练掌握使用钢笔工具绘制自由路径的技巧&#xff0c;才能快速完成复杂形状的创建以及精准抠图等工作。 钢笔工具是 Photoshop 中绘制路径的主要工具。无论是直线路径还是曲线路径&#xff0c;钢笔工具都能够提供高度的控制和精确度。 ◆ ◆ ◆ 绘制直线路径 绘制直线路径…

下载网页内容成HTML文件

今天遇到了一个非常好用的、开源的网页下载插件: SingleFile&#xff0c;它可以将当前网页里的文字、图片、超链接等&#xff0c;合并成单一的.html文件&#xff0c;便于保存和浏览查看。下面介绍SingleFile的安装和使用。 1、下载SingleFile插件 SingleFile官网地址&#xff…

高并发系统:它的通用设计方法是什么?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 我们知道&#xff0c;高并发代表着大流量&#xff0c;高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案&#xff0c;从而抵抗巨大流量的冲击&#xff0c;带给用户更好的使用体验。这些方案好似能…

Mybatis-Plus 租户使用

Mybatis-Plus 租户使用 文章目录 Mybatis-Plus 租户使用一. 前言1.1 租户存在的意义1.2 租户框架 二. Mybatis-plus 租户2.1 租户处理器2.2 前置准备1. 依赖2. 表及数据准备3. 代码生成器 2.3 使用 三. 深入使用3.1 前言3.2 租户主体设值&#xff0c;取值3.3 部分表全量db操作3…

大数据-之LibrA数据库系统告警处理(ALM-37004 Datanode主备不同步或者断连)

告警解释 当DN主实例与DN备实例连接异常时&#xff0c;产生该告警。 告警属性 告警ID 告警级别 可自动清除 37004 严重 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务名称 RoleName 产生告警的角色名称 HostName 产生告警的主机名 Instance 产生…

【古诗生成AI实战】之三——任务加载器与预处理器

本章内容属于数据处理阶段&#xff0c;将分别介绍任务加载器task和预处理器processor。 [1] 数据集 在深入探讨数据处理的具体步骤之前&#xff0c;让我们先了解一下我们将要使用的数据集的形式。 本项目采用的是七绝数据集&#xff0c;总计83072条古诗&#xff0c;其形式如下&…

大语言模型损失函数详解

我们可以把语言模型分为两类&#xff1a; 自动回归式语言模型&#xff1a;自动回归式语言模型在本质上是单向的&#xff0c;也就是说&#xff0c;它只沿着一个方向阅读句子。正向&#xff08;从左到右&#xff09;预测&#xff1b;反向&#xff08;从右到左&#xff09;预测。…

linux复习笔记04(小滴课堂)

软件安装rpm方式介绍&#xff1a; 先去挂载光盘&#xff1a; 要确保这是已连接状态。 我们查看到已经挂载成功了。 进到这个目录下。 我们可以看到这有很多rpm软件包。 man rpm: 可以看到很多参数&#xff0c;但是我们不需要全部掌握。 举例&#xff1a; 这就是告诉我们需要安…

2017年五一杯数学建模C题宜居城市问题值解题全过程文档及程序

2017年五一杯数学建模 C题 宜居城市问题 原题再现 城市宜居性是当前城市科学研究领域的热点议题之一&#xff0c;也是政府和城市居民密切关注的焦点。建设宜居城市已成为现阶段我国城市发展的重要目标,对提升城市居民生活质量、完善城市功能和提高城市运行效率具有重要意义。…