当前位置: 首页 > news >正文

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通信

服务器端&#xff1a; 客户端&#xff1a; 服务器&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug&…...

流程自动化变革:看低代码开发如何赋能企业创新转型

在数字化转型的浪潮中&#xff0c;企业面临着前所未有的挑战和机遇。为了保持竞争力&#xff0c;企业必须快速适应市场变化&#xff0c;创新业务模式&#xff0c;并提高运营效率。流程自动化成为企业转型的关键&#xff0c;而低代码开发平台如JNPF&#xff0c;正成为推动这一变…...

可提示 3D 分割研究里程碑!SAM2Point:SAM2加持泛化任意3D场景、任意提示!

郑重声明&#xff1a;本解读已获得论文作者的原创解读授权 文章链接&#xff1a;https://arxiv.org/pdf/2408.16768 在线demo: https://huggingface.co/spaces/ZiyuG/SAM2Point code链接&#xff1a;https://github.com/ZiyuGuo99/SAM2Point 亮点直击 无投影 3D 分割&#xff1…...

Rabbitmq中得RPC调用代码详解

文章目录 1.RPC客户端2.RabbitMQ连接信息实体类3.XML工具类 本文档只是为了留档方便以后工作运维&#xff0c;或者给同事分享文档内容比较简陋命令也不是特别全&#xff0c;不适合小白观看&#xff0c;如有不懂可以私信&#xff0c;上班期间都是在得 直接上代码了 1.RPC客户端 …...

ISAC: Toward Dual-Functional Wireless Networks for 6G and Beyond【论文阅读笔记】

此系列是本人阅读论文过程中的简单笔记&#xff0c;比较随意且具有严重的偏向性&#xff08;偏向自己研究方向和感兴趣的&#xff09;&#xff0c;随缘分享&#xff0c;共同进步~ 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&#xff0c;int limit) 2.3.1 当 int < 0时&#xff0c;会按照最大数量切割字符串 2.3.2 当 int 0时&#xff0c;此时就和第一个方法一样了&#xff0c;等于没有传入…...

HTTP 协议的基本格式

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

STM32-HAL库开发快速入门

注:本文主要记录一下STM32CubeMX软件的使用流程,记录内容以STM32外设&#xff08;中断、I2C、USART、SPI等配置&#xff09;在STM32CubeMX中的设置为主&#xff0c;对驱动代码编写不做记录&#xff0c;所以阅读本文最好有标准库开发经验。除第2节外&#xff0c;使用的都是韦东山…...

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项目

初始化项目 &#xff08;1&#xff09;cmd切换到指定工作目录&#xff0c;运行pnpm create vue命令&#xff0c;输入项目名称后按需安装组件 &#xff08;2&#xff09;使用vs code打开所创建的项目目录&#xff0c;Ctrl~快捷键打开终端&#xff0c;输入pnpm install下载项目…...

springboot配置多数据源

springboot配置多数据源 学习新技术&#xff0c;争做新青年&#xff0c;欢迎围观&#xff0c;河南老乡在上海请&#xff0c;加&#xff0c;微&#xff0c;andyfau2022&#xff0c; ----获取数据源&#xff1a;null&#xff0c;数据源为null时默认使用主数据源的。 1-yml文件…...

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题&#xff1a;墙体两侧特征混淆误匹配&#xff0c;导致建图和定位偏差&#xff0c;表现为过门跳变、外月台走歪等 解决思路&#xff1a;预期的根治方案IGICP需要较长时间完成上线&#xff0c;先使用切分地图的工程化方案&#xff0c;即墙体两侧切…...

ChatGPT+Simple Mind Map生成思维导图:快速提升学习效率

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

Day9 | Java框架 | SpringBoot

Day9 | Java框架 | SpringBoot SpringBoot简介入门程序概述起步依赖 基础配置配置文件格式&#xff1a;3种yaml语法规则yaml数据读取三种格式 多环境启动配置文件参数命令行参数多环境开发控制&#xff1a;Maven & SpringBoot 多环境兼容 配置文件分类&#xff1a;4种 整合…...

Wordpress右下角表单弹出插件

Ultimate Sticky Popup & Widgets Charcoal Making Machine | Equipment for Sale - Kingtiger...

影刀RPA实战:自动化批量生成条形码完整指南

今天我们聊聊使用影刀来实现批量生成条形码&#xff0c;条形码在零售行业运用非常广泛&#xff0c;主要作用表现在产品识别&#xff0c;库存管理&#xff0c;销售管理&#xff0c;防伪保护等&#xff0c;这些作用使其成为现代商业和工业环境中不可或缺的工具&#xff0c;它极大…...

Python Flask简介

简介 Flask 有两个主要依赖&#xff1a;路由、调试和 Web 服务器网关接口&#xff08;Web Server Gateway Interface&#xff0c;WSGI&#xff09; 子系统由&#xff1a;Werkzeug 提供模板系统由&#xff1a;Jinja2提供Werkzeug 和 Jinjia2 都是由 Flask 的核心开发者开发而成…...

视频监控平台是如何运作的?EasyCVR视频汇聚平台的高效策略与实践

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

欧拉下搭建第三方软件仓库—docker

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

pcs升压变流一体机

在当今全球积极推进能源转型的大背景下&#xff0c;新能源技术的发展日新月异。其中&#xff0c;PCS 升压变流一体机作为一种关键的能源转换设备&#xff0c;正发挥着越来越重要的作用。它一般可分为10KV与35KV等级的。 PCS 升压变流一体机&#xff0c;全称为 Power Conversion…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

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双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

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@浙大疏锦行

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...