QT实现TCP/UDP通信
服务器端:
客户端:
服务器:
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>
#include <QMessageBox>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots://自定义处理信号与槽函数void on_startButton_clicked();void newConnection_slot();void readyRead_slot();private:Ui::Widget *ui;QTcpServer *server;//定义服务器指针QList<QTcpSocket*> socketList;//定义存放客户端信息的容器};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//实例化一个服务器对象server = new QTcpServer(this);//在堆区申请一个服务器}Widget::~Widget()
{delete ui;
}//启动服务器按钮对应的槽函数
void Widget::on_startButton_clicked()
{if(ui->startButton->text()== "启动服务器"){//执行启动服务器动作//获取ui界面的端口号 ???quint16 port = ui->portEdit->text().toUInt();//启动监听//函数原型 bool listen(const QHostAddress &address = QHostAddress::any,quint16 port = 0);//1->要监听的ip地址 写any 表示监听该主机上所有的网络接口//2->要监听的端口号 不指定 系统默认随机绑定一个端口号if(!server->listen(QHostAddress::Any,port)){QMessageBox::critical(this,"错误","服务器启动失败");return;}//程序启动至此表示服务器启动成功QMessageBox::information(this,"成功","服务器启动成功");//将行编辑器设置为不可用ui->portEdit->setEnabled(false);//将按钮文本内容设置为关闭服务器ui->startButton->setText("关闭服务器");//此时 如果有客户端发来请求 那么该服务器会自动发射一个newConnection信号//将该信号连接到自定槽函数中处理后续操作connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);}else{//执行关闭服务器操作server->close();//将行编辑器设置成为可用状态ui->portEdit->setEnabled(true);//将按钮文本内容设置为启动服务器ui->startButton->setText("启动服务器");}
}void Widget::newConnection_slot()
{qDebug()<<"有新的客户端发来连接请求";//可以通过nextPendingConnection函数获取最新连接的客户端套接字的地址//函数原型 QTcpSocket *nextPendingConnection();//无参函数//返回值 最新的连接的套接字地址QTcpSocket *s = server->nextPendingConnection();//将套接字地址放入链表中socketList.push_back(s);//一个服务器对应多个客户端 已经建立连接//如果有客户端发来消息 自动发射readyRead信号connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}
void Widget::readyRead_slot()
{//遍历链表中的所有客户端 如果客户端状态未连接 则直接移除出链表for (int i=0 ;i<socketList.size();i++){//判断当前套接字 socketList[i] 是否失效//函数原型 SocketState state() const;//返回值 返回当前调节子状态//返回结果为0 表示未连接if(socketList[i]->state()==0){socketList.removeAt(i);}}//遍历所有客户端 判断客户端中是否有数据刻度 如果有数据可读 则表示该客户端发来的消息for (int i =0;i<socketList.count();i++){//判断当前 客户端中是否有数据可读//函数原型 qint64 byteAvailable() const overrde//参数无//返回值为当前客户端套接字中的待读数据 如果没有数据 则返回0if(socketList[i]->bytesAvailable() !=0){//读取当前套接字的内容QByteArray msg = socketList[i]->readAll();//将接受的消息展示到ui界面上ui->msgListWidget->addItem(QString::fromLocal8Bit(msg));//将收到的消息 全部发给其他客户端for (int j=0;j<socketList.length();j++){if (i!=j){socketList[j]->write(msg);}}}}
}
客户端
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTcpSocket> //客户端套接字类
#include<QMessageBox> //消息对话框类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_connectBtn_clicked();void connected_slot(); //自定义处理connected信号的槽函数void readyRead_slot(); //自定义处理readyRead信号的槽函数void disconnected_slot(); //自定义处理disconnected信号的槽函数void on_sendBtn_clicked();void on_disConnectBtn_clicked();private:Ui::Widget *ui;//定义通信用的变量QTcpSocket *client; //定义套接字指针QString userName; //用户名};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//实例化客户端对象client = new QTcpSocket(this);//当客户端与服务器建立联系后,如果客户端接受到服务器发来的消息//客户端自身就会自动发射一个 readyRead的信号,我们可以将该信号连接到自定义的槽函数中执行相关逻辑connect(client, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);//如果当前客户端成功连接的服务器,那么该客户端就会自动发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑connect(client, &QTcpSocket::connected, this, &Widget::connected_slot);//当客户端断开了与服务器的连接后,该客户端就会自动发射一个disconnected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑connect(client, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);
}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{//获取ui界面上的数据QString ip = ui->ipEdit->text(); //ip地址quint16 port = ui->portEdit->text().toUInt(); //端口号userName = ui->nameEdit->text(); //用户名//调用套接字成员函数,连接服务器//函数原型:void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);//参数1:要被连接的服务器ip地址//参数2:服务器的端口号//参数3:默认为可读可写//返回值:无client->connectToHost(ip, port);
}//处理connected信号的槽函数的定义
void Widget::connected_slot()
{QMessageBox::information(this,"成功","连接成功");//将相关组件禁用ui->ipEdit->setEnabled(false);ui->nameEdit->setEnabled(false);ui->portEdit->setEnabled(false);ui->connectBtn->setEnabled(false);//向服务器发送一条消息QString msg = userName + ": 进入聊天室";client->write( msg.toLocal8Bit() );
}//自定义处理readyRead信号的槽函数
void Widget::readyRead_slot()
{//从套接字中读取数据QByteArray msg = client->readAll();//将读取下来的数据展示到ui界面上ui->msgListWidget->addItem( QString::fromLocal8Bit(msg) );
}//消息发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{//组织要发送的消息QString msg = userName + ": " + ui->msgEdit->text();//将消息发送给服务器client->write(msg.toLocal8Bit());//将消息展示到自己界面上//准备一个QListWidgetItem类的对象QListWidgetItem *item = new QListWidgetItem(msg);item->setTextAlignment(Qt::AlignRight); //将文本右对齐ui->msgListWidget->addItem(item);//清空消息发送框的内容ui->msgEdit->clear();
}//断开连接按钮对应的槽函数
void Widget::on_disConnectBtn_clicked()
{//执行断开连接的操作//准备发送消息给服务器QString msg = userName + ": 离开聊天室";client->write(msg.toLocal8Bit());//断开连接client->disconnectFromHost();
}//自定义处理disconnected信号的槽函数的定义
void Widget::disconnected_slot()
{QMessageBox::information(this, "提示", "成功断开与服务器的连接");//将相关组件启用ui->ipEdit->setEnabled(true);ui->nameEdit->setEnabled(true);ui->portEdit->setEnabled(true);ui->connectBtn->setEnabled(true);
}
相关文章:

QT实现TCP/UDP通信
服务器端: 客户端: 服务器: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug&…...
流程自动化变革:看低代码开发如何赋能企业创新转型
在数字化转型的浪潮中,企业面临着前所未有的挑战和机遇。为了保持竞争力,企业必须快速适应市场变化,创新业务模式,并提高运营效率。流程自动化成为企业转型的关键,而低代码开发平台如JNPF,正成为推动这一变…...

可提示 3D 分割研究里程碑!SAM2Point:SAM2加持泛化任意3D场景、任意提示!
郑重声明:本解读已获得论文作者的原创解读授权 文章链接:https://arxiv.org/pdf/2408.16768 在线demo: https://huggingface.co/spaces/ZiyuG/SAM2Point code链接:https://github.com/ZiyuGuo99/SAM2Point 亮点直击 无投影 3D 分割࿱…...
Rabbitmq中得RPC调用代码详解
文章目录 1.RPC客户端2.RabbitMQ连接信息实体类3.XML工具类 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都是在得 直接上代码了 1.RPC客户端 …...

ISAC: Toward Dual-Functional Wireless Networks for 6G and Beyond【论文阅读笔记】
此系列是本人阅读论文过程中的简单笔记,比较随意且具有严重的偏向性(偏向自己研究方向和感兴趣的),随缘分享,共同进步~ Integrated Sensing and Communications: Toward Dual-Functional Wireless Networks for 6G and…...

split 分割字符串方法解析,substring 截取字符串方法解析;二者的作用和区别?使用时需要注意什么?附代码和运行图
目录 一. 摘要 二. split 方法 2.1 String[] split(String regix) 2.2 String[] split(String regix,int limit) 2.3.1 当 int < 0时,会按照最大数量切割字符串 2.3.2 当 int 0时,此时就和第一个方法一样了,等于没有传入…...

HTTP 协议的基本格式
HTTP协议("超文本传输协议"),是一个被广泛使用应用层协议,自1991年正式发布HTTP协议以来,HTTP协议就一直在更新,目前已经更新到3.0版本,但是目前主流的依旧是1.1版本,但依旧是一个最主流使用的应…...

STM32-HAL库开发快速入门
注:本文主要记录一下STM32CubeMX软件的使用流程,记录内容以STM32外设(中断、I2C、USART、SPI等配置)在STM32CubeMX中的设置为主,对驱动代码编写不做记录,所以阅读本文最好有标准库开发经验。除第2节外,使用的都是韦东山…...
vue3-print打印eletable某一行的数据
主页面的表格 <template><el-table :data"list"><el-table-column label"操作" align"center"><template #default"scope"><el-buttonlinktype"primary"click"handleType(scope.row)"…...

【Vue】pnpm创建Vue3+Vite项目
初始化项目 (1)cmd切换到指定工作目录,运行pnpm create vue命令,输入项目名称后按需安装组件 (2)使用vs code打开所创建的项目目录,Ctrl~快捷键打开终端,输入pnpm install下载项目…...

springboot配置多数据源
springboot配置多数据源 学习新技术,争做新青年,欢迎围观,河南老乡在上海请,加,微,andyfau2022, ----获取数据源:null,数据源为null时默认使用主数据源的。 1-yml文件…...
无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案
墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切…...

ChatGPT+Simple Mind Map生成思维导图:快速提升学习效率
一、告别杂乱笔记,一键生成清晰思维导图! 最近开始学习网络安全,一头扎进了各种协议、漏洞、防御机制的海洋中。信息量巨大,知识点零散,让我很快便陷入了“知识焦虑”——笔记越记越多,却越来越混乱&#…...

Day9 | Java框架 | SpringBoot
Day9 | Java框架 | SpringBoot SpringBoot简介入门程序概述起步依赖 基础配置配置文件格式:3种yaml语法规则yaml数据读取三种格式 多环境启动配置文件参数命令行参数多环境开发控制:Maven & SpringBoot 多环境兼容 配置文件分类:4种 整合…...
Wordpress右下角表单弹出插件
Ultimate Sticky Popup & Widgets Charcoal Making Machine | Equipment for Sale - Kingtiger...

影刀RPA实战:自动化批量生成条形码完整指南
今天我们聊聊使用影刀来实现批量生成条形码,条形码在零售行业运用非常广泛,主要作用表现在产品识别,库存管理,销售管理,防伪保护等,这些作用使其成为现代商业和工业环境中不可或缺的工具,它极大…...
Python Flask简介
简介 Flask 有两个主要依赖:路由、调试和 Web 服务器网关接口(Web Server Gateway Interface,WSGI) 子系统由:Werkzeug 提供模板系统由:Jinja2提供Werkzeug 和 Jinjia2 都是由 Flask 的核心开发者开发而成…...

视频监控平台是如何运作的?EasyCVR视频汇聚平台的高效策略与实践
随着科技的飞速发展,视频监控平台在社会安全、企业管理、智慧城市构建等领域发挥着越来越重要的作用。一个高效的视频监控平台,不仅依赖于先进的硬件设备,更离不开强大的视频处理技术作为支撑。这些平台集成了多种先进的视频技术,…...

欧拉下搭建第三方软件仓库—docker
1.创建新的文件内容 切换目录到etc底下的yum.repos.d目录,创建docker-ce.repo文件 [rootlocalhost yum.repos.d]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vim docker-ce.repo 编辑文件,使用阿里源镜像源,镜像源在编辑中需要单独复制 h…...

pcs升压变流一体机
在当今全球积极推进能源转型的大背景下,新能源技术的发展日新月异。其中,PCS 升压变流一体机作为一种关键的能源转换设备,正发挥着越来越重要的作用。它一般可分为10KV与35KV等级的。 PCS 升压变流一体机,全称为 Power Conversion…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
python打卡day49@浙大疏锦行
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...