QT实现TCP和UDP协议通信(一)

编程环境 :Windows10 x64 下 QtCreator
语言 :C++
作者 :wddkxg
时间 :2022.4.24
项目 :Server + Client

**Server(服务器端)**
1.创建新项目 选择Qt Widget Application即可 。
2.项目工程文件中(.pro)加入 QT += network
3.引入头文件<QTcpServer> , <QTcpSocket> , <QUdpSocket>
4.ui界面设计 可以设计的相对简单 。
一个lineEdit 用于输入端口号,一个lineEdit 用于显示连接状态,两个RadioButton为选择协议,
一个PushButton 为侦听按钮 ,再加上一个TextEdit用于显示信息文本
![Server的ui设计图](https://img-blog.csdnimg.cn/bb11ee85d58b4ad4939c91197222af98.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6YeR5puc5pel44Gu5paw5oGS,size_12,color_FFFFFF,t_70,g_se,x_16#pic_center)
5.Server需要的几个功能:侦听端口、创建连接、读取数据(分为TCP和UDP协议)
对应的槽函数为:
void on_pushButton_listen_clicked();//TCP侦听
void server_new_connect(); //创建新连接
void socket_read_data();//TCP读取缓冲区数据
void read_data();//UDP读取缓冲区数据
6.创建对象:
QUdpSocket *uServer;//UDP套接字对象
QTcpServer *mServer;
QTcpSocket *mSocket;//TCP套接字对象
7.源码:
server.h
#ifndef SERVER_H
#define SERVER_H#include <QMainWindow>
#include<QTcpServer>
#include<QTcpSocket>
#include<QUdpSocket>namespace Ui { class Server; }class Server : public QMainWindow
{Q_OBJECTpublic:Server(QWidget *parent = nullptr);~Server();private slots:void on_pushButton_listen_clicked();//TCP侦听void server_new_connect(); //创建新连接void socket_read_data();//TCP读取缓冲区数据void read_data();//UDP读取缓冲区数据void on_comboBox_currentIndexChanged();//界面转换private:Ui::Server *ui;QUdpSocket *uServer;//UDP套接字对象QTcpServer *mServer;QTcpSocket *mSocket;//TCP套接字对象int i1,i2;int j1,j2;
};
#endif // SERVER_H

server.cpp

/******************************************************************************************/
/*                                        服务端                                          */
/*                                        2022.03.02                                      */
/*                                        wddkxg                                          */
/*                                        v1.0                                            */
/******************************************************************************************/#include "server.h"
#include "ui_server.h"/*构造函数*/
Server::Server(QWidget *parent): QMainWindow(parent), ui(new Ui::Server)
{ui->setupUi(this);ui->portEdit->setText("8080");//默认端口号为8080mServer = new QTcpServer();//初始化TCP对象connect(mServer,&QTcpServer::newConnection,this,&Server::server_new_connect);//初始化表格行列计数变量i1 = 0;j1 = 0;i2 = 0;j2 = 0;uServer = new QUdpSocket(this); //初始化UDP对象uServer->bind(QHostAddress("10.0.0.58"),8080);//绑定ip地址和端口号connect(uServer,SIGNAL(readyRead()),this,SLOT(read_data()));//连接信号槽
}/*UDP读取缓冲数据*/
void Server::read_data()
{if(ui->radioButton_UDP->isChecked())//判断是否勾选UDP协议{qDebug()<<"recv_UDP";QByteArray arr;//创建QByteArray对象存储缓冲区数据arr.resize(uServer->bytesAvailable());//设置字符串大小uServer->readDatagram(arr.data(),arr.size());//读取缓冲区数据qDebug()<<uServer->readDatagram(arr.data(),arr.size());QString str ;//创建QString对象用于进行缓冲数据的处理str.prepend(arr);//QByteArray转QStringqDebug()<<"str="<<str;if(ui->comboBox->currentText() == "DataA")//处理为DataA数据类型{ui->stackedWidget->setCurrentIndex(0);qDebug()<<str.section(' ',0,0);ui->table_output_A->item(i2,j2)->setText(str.section(' ',0,j2));j2++;qDebug()<<str.section(' ',1,1);ui->table_output_A->item(i2,j2)->setText(str.section(' ',1,j2));j2++;qDebug()<<str.section(' ',2,2);ui->table_output_A->item(i2,j2)->setText(str.section(' ',2,j2));i2++;j2=0;}else//处理为DataB数据类型{ui->stackedWidget->setCurrentIndex(1);ui->table_output_B->item(i2,j2++)->setText(str.section(' ',0,0));ui->table_output_B->item(i2,j2++)->setText(str.section(' ',1,1));i2++;j2=0;}}}/*析构函数*/
Server::~Server()
{uServer->close();uServer->deleteLater();mServer->close();mServer->deleteLater();delete ui;
}
/*TCP侦听*/
void Server::on_pushButton_listen_clicked()
{if(ui->pushButton_listen->text() == QString::fromLocal8Bit("侦听")){int port = ui->portEdit->text().toInt();if(!mServer->listen(QHostAddress("10.0.0.58"),port))//判断侦听本机端口和地址是否成功{ui->portEdit_state->setText(QString::fromLocal8Bit("侦听失败!"));//侦听失败qDebug()<<mServer->errorString();return;}ui->pushButton_listen->setText(QString::fromLocal8Bit("取消侦听"));//改变按键功能ui->portEdit_state->setText(QString::fromLocal8Bit("侦听成功!"));//侦听成功qDebug()<<"Listen successful!";}else//侦听失败{mSocket->abort();//销毁TCP套接字对象mServer->close();ui->portEdit_state->setText(QString::fromLocal8Bit("侦听失败!"));//返回侦听失败ui->pushButton_listen->setText(QString::fromLocal8Bit("侦听"));//改变按键功能}
}/*连接新用户*/
void Server::server_new_connect()
{mSocket = mServer->nextPendingConnection();QObject::connect(mSocket,&QTcpSocket::readyRead,this,&Server::socket_read_data);//连接函数槽ui->portEdit_state->setText(QString::fromLocal8Bit("连接成功!"));
//    ui->table_output_A->clear();
//    ui->table_output_B->clear();qDebug()<<"A client connect!";
}/*接收数据*/
void Server::socket_read_data()
{if(ui->radioButton_TCP->isChecked()){QString str= mSocket->readAll();qDebug()<<"recv_TCP";if(ui->comboBox->currentText() == "DataA")//判断下拉选项的数据类型{ui->stackedWidget->setCurrentIndex(0);//切换为dataA数据格式表ui->table_output_A->item(i1,j1++)->setText(str.section(' ',0,0));ui->table_output_A->item(i1,j1++)->setText(str.section(' ',1,1));ui->table_output_A->item(i1,j1++)->setText(str.section(' ',2,2));i1++;j1=0;}else{ui->stackedWidget->setCurrentIndex(1);//切换为data数据格式表ui->table_output_B->item(i1,j1++)->setText(str.section(' ',0,0));ui->table_output_B->item(i1,j1++)->setText(str.section(' ',1,1));i1++;j1=0;}}}
/*下拉框实现dataA与dataB数据结构表的切换*/
void Server::on_comboBox_currentIndexChanged()
{if(ui->comboBox->currentText() == "DataA")//判断选定数据类型ui->stackedWidget->setCurrentIndex(0);elseui->stackedWidget->setCurrentIndex(1);
}

mian2.cpp

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

8.以上为接收端(服务器端)设计方案。

【QT实现TCP和UDP协议通信(一)】相关推荐

  1. 【QT实现TCP和UDP协议通信(二)】

    QT实现TCP和UDP协议通信(二) 编程环境 :Windows10 x64 下 QtCreator 语言 :C++ 作者 :wddkxg 时间 :2022.4.24 项目 :Server + Cli ...

  2. TCP与UDP协议初步学习——网络环境中分布式进程通信的基本概念

    TCP与UDP协议初步学习--网络环境中分布式进程通信的基本概念 一.单机系统中进程通信方法 进程和进程通信是操作系统中最基本的概念,首先通过回忆操作系统课程中,关于单击系统中进程和进程通信的问题描述 ...

  3. TCP与UDP协议,socket套接字编程,通信相关操作

    文章目录 TCP与UDP协议 TCP协议 ==三次握手== ==四次挥手== UDP协议 TCP与UDP的区别 应用层 socket套接字 代码优化 循环通信 半连接池 粘包问题 TCP与UDP协议 ...

  4. 【QT网络编程】实现UDP协议通信

    文章目录 概要:本期主要讲解QT中对UDP协议通信的实现. 一.UDP协议通信 二.Qt中UDP协议的处理 1.QUdpSocket 三.Qt实现UDP通信 1.客户端 2.服务器端 结尾 概要:本期 ...

  5. 计算机网络实验 ——wireshark抓包简要分析TCP、UDP协议

    [计算机网络实验 --wireshark抓包简要分析TCP.UDP协议] (1)分析 TCPheader: Source Port:16bit源端口,数据发起者的端口号: Destination Po ...

  6. 计算机网络-传输层(传输层概述,TCP,UDP协议概述)

    文章目录 1. 传输层概述 2. TCP,UDP协议概述 3. 传输层的寻址与端口 1. 传输层概述 传输层是只有主机才有的层次. 传输层功能: 传输层提供进程和进程之间的逻辑通信. 网络层提供主机到 ...

  7. TCP和UDP协议的区别以及原理

    TCP和UDP协议的区别以及原理 该文章是学习了B站up主的视频做的总结,讲的很通俗易懂,首先感谢博主的分享.视频地址:https://www.bilibili.com/video/BV1kV411j ...

  8. 图文并茂,讲解TCP和UDP协议的原理以及区别

    TCP和UDP协议的区别以及原理 最近重新认知了一下TCP和UDP的原理以及区别,做一个简单的总结. 一.作用 首先,tcp和udp都是工作在传输层,用于程序之间传输数据的.数据一般包含:文件类型,视 ...

  9. 利用TCP和UDP协议,实现基于Socket的小聊天程序(初级版)

    TCP TCP (Transmission Control Protocol)属于传输层协议.其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送.可靠性.有效流控.全双工操作和多路复用 ...

最新文章

  1. Java 8 中的这个接口真好用!
  2. 关于Unicode,字符集,字符编码
  3. 解決scott 用戶登錄錯誤: invalid username/password;logon denied
  4. Hyperopt中文文档:Cite引用
  5. self.view = nil 和[self.view release]的区别
  6. java底层编程_万字长文!从底层开始带你了解并发编程,彻底帮你搞懂Java锁!
  7. 网络层:IP协议详解(IP协议真的得看这篇)
  8. 8g ubuntu 树莓派4b_树莓派4B如何安装ubuntu20.04
  9. mysql金额数据类型,热度飙升!
  10. 使用docker部署skywalking
  11. GB28181协议错误码返回码整理
  12. u盘修复计算机系统,U盘启动盘修复win10系统的详细步骤
  13. SyncToy 文件同步工具的定时同步方案(不使用第三方软件)
  14. 在学校,你需要知道的8种思维导图的类型及其工作方式
  15. 基于matlab的锁相环频率合成器,基于MATLAB锁相环.ppt
  16. 计算方法-数值积分与微分
  17. 短信、长短信、彩信的PDU
  18. C语言程序设计-餐厅点餐系统
  19. Java中的标识符、关键字、字面值、变量、八种基本数据类型与类型转换规则
  20. 全链路压测原理剖析(Coding)

热门文章

  1. 基于WebGL架构的3D可视化平台—城市地下管线3D可视化
  2. 让海航买不起的当当究竟值多少钱?90亿够不够?
  3. 价值投资私募基金三人谈
  4. 解决opensslErrorStack: [ ‘error:03000086:digital envelope routines::initialization error‘ ]的问题
  5. Python 3网络爬虫开发实战
  6. amoled led 排列_AMOLED屏幕为啥不用RGB排列?
  7. 关于软文营销,你真的了解它吗?
  8. JavaScript实现图片漂浮
  9. 炫酷的表白烟花 html+css+js实现的表白烟花特效(程序员专属情人节表白网站)
  10. 西安腾讯云面试总结(已拿offer)