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

2023-11-27 10:15

本文主要是介绍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开发板开作为下位机

通过网络编程实现通信

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

这篇关于Qt TCP网络上位机的设计(通过网络编程与下位机结合)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/427488

相关文章

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async