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

QT---day5,通信

1、思维导图

 2、TCp

服务器
 

#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
#include <QTcpServer>
#include <QList>
#include <QTcpSocket>
#include <QMessageBox>
#include <QDebug>
#include <QTcpServer>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
 
class MyWidget : public QWidget
{
    Q_OBJECT
 
public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
 
private slots:
    //void on_pButton_clicked();
 
    void on_startbtn_clicked();
 
    void newConnect_slot();
 
    void readyRead_slot();
 
private:
    Ui::MyWidget *ui;
    QTcpServer *ser;
    QList<QTcpSocket *> cliList;      //客户端容器链表
 
};
#endif // MYWIDGET_H
#include "mywidget.h"
#include "ui_mywidget.h"
 
 
 
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
 
 
    //1、给服务器指针实例化对象
    ser = new QTcpServer(this);
 
 
}
 
 
MyWidget::~MyWidget()
{
    delete ui;
}
 
 
//启动按钮对应的槽函数
void MyWidget::on_startbtn_clicked()
{
    if(ui->startbtn->text() == "启动")
    {
        //获取ui界面上的端口号
        quint16 port = ui->portEdit->text().toUInt();
 
 
 
 
        //启动服务器
        //2、将服务器设置成被动监听状态
        if(ser->listen(QHostAddress::Any, port) == true)
        //参数1:监听的ip地址,如果设置成Any,表示监听所有类型的主机地址,也可以指定特定的主机地址进行监听
        //参数2:端口号,如果设置为0,则让系统自动分配一个端口号,如果使用具体的端口号,则需要指定
        {
            QMessageBox::information(this, "成功", "服务器启动成功");
        }else
        {
            QMessageBox::information(this, "成功", "服务器启动失败");
        }
 
 
        //当启动服务器后,如果有客户端发来连接请求,那么该服务器就会自动发射一个newConnection信号
        //我们可以将该信号,连接到对应的槽函数中处理相关逻辑
        connect(ser, &QTcpServer::newConnection, this, &MyWidget::newConnect_slot);
 
 
 
 
        //将文本内容更改成 关闭
        ui->startbtn->setText("关闭");
    }else
    {
        //关闭服务器
        ser->close();        //关闭监听
 
 
        //将文件内容更改成 启动
        ui->startbtn->setText("启动");
    }
}
 
 
//处理nY
void MyWidget::newConnect_slot()
{
    qDebug () <<"有新客户端发来连接请求了,请尽快处理";
    //获取最新连接的客户端套接字,并将最新连接的套接字地址返回
    QTcpSocket* socket = ser->nextPendingConnection();
 
 
    //将该客户端套接字放入到客户端容器中
    cliList.append(socket);
 
 
    //当有客户端向服务器发来数据时,当前这个客户端套接字就会自动发射一个readyRead信号
    //我们可以将该信号连接到对应的信号处理函数中,处理相关数据
    connect(socket, &QTcpSocket::readyRead, this, &MyWidget::readyRead_slot);
 
 
}
 
 
//关于readyRead信号对应的槽函数的定义
void MyWidget::readyRead_slot()
{
    //判断客户端容器中,是否有已经退出的客户端,或无效的客户端,如果有,将其进行移除
    for(int i=0; i<cliList.length(); i++)
    {
        if(cliList[i]->state() == QTcpSocket::UnconnectedState)
        {//功能:判断当前套接字的状态
           //参数:无
           //返回值:readyRead_slot表示无效的套接字
           cliList.removeAt(i);           //将下标为i的客户端套接字从容器中移除
        }
    }
 
 
    //再将客户端容器遍历一遍,判断哪个客户端中有数据待读
    for(int i=0; i<cliList.length(); i++)
    {
        if(cliList[i]->bytesAvailable() != 0)
        {
            //功能:获取当前套接字中待读数据的个数
            //参数:无
            //返回值:返回套接字中待读数据的个数,如果为0,表示没有数据可读
            //如果不等于0,表示有数据可读,可以使用readAll读取数据
            QByteArray msg = cliList[i]->readAll();
 
 
            //将该消息,展示到ui界面上
            ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
 
 
            //将该消息转发给所有客户端
            for(int j=0; j<cliList.length(); j++)
            {
                if(i!=j)        //不转发给自己
                {
                    cliList[j]->write(msg);
                }
            }
        }
    }
}
 
 

 客户端

 

#ifndef MYWIDGET_H
#define MYWIDGET_H
 
#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
 
class MyWidget : public QWidget
{
    Q_OBJECT
 
public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
 
private slots:
    void on_pushButton_clicked();
    void connnected_slot();
    void readyRead_slot();
 
 
private:
    Ui::MyWidget *ui;
    QTcpSocket *cli;          //定义客户端指针
     QString userName;          //用户名
};
#endif // MYWIDGET_H
 

 

#include "mywidget.h"
#include "ui_mywidget.h"
 
 
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
 
 
    //实例化一个客户端对象
    cli = new QTcpSocket(this);
 
    connect(cli,&QTcpSocket::connected,this,&MyWidget::connnected_slot);
 
    connect(cli,&QTcpSocket::readyRead,this,&MyWidget::readyRead_slot);
 
    //将客户端的connected信号连接到自定义的槽函数中
    connect(cli, &QTcpSocket::connected, this, &MyWidget::connnected_slot);
}
 
MyWidget::~MyWidget()
{
    delete ui;
}
 
 
 
 
 
//连接服务器按钮对应的槽函数
void MyWidget::on_pushButton_clicked()
{
    if(ui->intobtn->text() == "连接服务器")
    {
        //执行连接服务器的工作
        //获取ui界面上的数据
        userName = ui->userNameEdit->text();         //用户名
        QString ip = ui->ipEdit_2->text();            //ip地址
        quint16 port = ui->portEdit->text().toUInt();   //端口号
 
 
        //向服务器发送连接请求
        cli->connectToHost(ip, port);
        //功能:向指定的服务器发送连接请求
        //参数1:服务器ip地址
        //参数2:服务器端口号
 
 
        //当成功连接服务器后,当前客户端会自动发射一个connected的信号,我们可以将该信号连接到对应的槽函数中处理逻辑
        //由于该操作只需进行一次即可,所以写在构造函数中即可
 
 
        //将按钮内容更成 断开服务器
        ui->intobtn->setText("断开服务器");
    }else
    {
 
       QString msg = userName+":离开聊天室";
       cli->write(msg.toLocal8Bit());
 
        //执行断开服务器工作
        cli->disconnectFromHost();
 
        //将按钮内容更改成 连接服务器
         ui->intobtn->setText("连接服务器");
    }
}
 
//处理readyRead信号对应的槽函数的是实现
void MyWidget::readyRead_slot()
{
    QByteArray msg =cli->readAll();
 
    ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
}
 
//自定义处理connnected信号的槽函数的实现
void MyWidget::connnected_slot()
{
    QMessageBox::information(this, "连接", "连接服务器成功!!!");
}
 

 

相关文章:

QT---day5,通信

1、思维导图 2、TCp 服务器 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QTcpServer> #include <QList> #include <QTcpSocket> #include <QMessageBox> #include <QDebug> #include <QTcpServer> QT_B…...

设计模式: 工厂模式

工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂模式属于创建型…...

Java 多线程补充

线程池 Java线程池是一种能够有效管理线程资源的机制&#xff0c;它可以显著提高应用性能并降低资源消耗。 线程池的主要优点包括&#xff1a; 资源利用高效&#xff1a;通过重用已存在的线程&#xff0c;减少了频繁创建和销毁线程带来的系统开销。响应速度提升&#xff1a;…...

【Java基础】Maven继承

1. 前言 Maven 在设计时&#xff0c;借鉴了 Java 面向对象中的继承思想&#xff0c;提出了 POM 继承思想。 2. Maven继承 当一个项目包含多个模块时&#xff0c;可以在该项目中再创建一个父模块&#xff0c;并在其 POM 中声明依赖&#xff0c;其他模块的 POM 可通过继承父模…...

java技术总结

1.java基本数据类型? byte 1,short 2 ,int 4,long 8 ,float 4,double 8,boolean 1,char 2 2.java为什么要有包装类型? 前 6 个类派生于公共的超类 Number,而 Character 和 Boolean 是 Object 的直接子类。 被 final 修饰, Java 内置的包装类是无法被继承的。 包装…...

C# WinForm —— 12 ListBox绑定数据

ListBox加载大量数据时&#xff0c;避免窗体闪烁的方法&#xff1a; 在加载语句的前后分别加上 BeginUpdate()方法 和 EndUpdate()方法 指定一个集合为绑定的数据源 1. 首先&#xff0c;右键项目&#xff0c;添加类 2. 在新建的类文件中添加属性值信息 3. 构建初始化的对象…...

自动驾驶主流芯片及平台架构(二)特斯拉自动驾驶芯片平台介绍

早期 对外采购mobileye EyeQ3 芯片摄像头半集成方案&#xff0c;主要是为了满足快速量产需求&#xff0c;且受制于研发资金不足限制&#xff1b; 中期 采用高算力NVIDIA 芯片平台其他摄像头供应商的特斯拉内部集成方案&#xff0c;mobileye开发节奏无法紧跟特斯拉需求&#xff…...

powershell@管道符过滤的顺序问题@powershell管道符如何工作

文章目录 select 和 where谁先执行powershell管道符stop-service 为例查看文档中的典型参数介绍stop-process为例介绍管道符传参是怎么工作的Id参数InputObject 参数Name参数额外的试验反面例子应用:get-process 和stop-process配合 select 和 where谁先执行 在执行筛选时&…...

SMI接口

目录 SMI 接口帧格式读时序写时序 IP 设计IP 例化界面IP 接口IP 验证 SMI 接口 SMI&#xff08;Serial Management Interface&#xff09;串行管理接口&#xff0c;也被称作 MII 管理接口&#xff08;MII Management Interface&#xff09;&#xff0c;包括 MDC 和 MDIO 两条信…...

【C++】转换构造函数和类型转换函数

目录 转换构造函数转换构造函数调用 类型转换函数类型转换函数定义形式应用 转换构造函数 转换构造函数就是一种构造函数&#xff0c;将一个其他类型的数据转换成一个类的对象的构造函数。 类型->类对象 转换构造函数调用 &#xff08;1&#xff09;显式强制类型转换&…...

全栈开发之路——前端篇(5)组件间通讯和接口等知识补充

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 辅助文档&…...

4.【Orangepi Zero2】Linux定时器(signal、setitimer),软件PWM驱动舵机(SG90)

Linux定时器&#xff08;signal、setitimer&#xff09;&#xff0c;软件PWM驱动舵机&#xff08;SG90&#xff09; signalsetitimer示例 软件PWM驱动舵机&#xff08;SG90&#xff09; signal 详情请看Linux 3.进程间通信&#xff08;shmget shmat shmdt shmctl 共享内存、si…...

K8S哲学 - 资源调度 HPA (horizontal pod autoScaler-sync-period)

kubectl exec&#xff1a; kubectl exec -it pod-name -c container-name -- /bin/sh kubectl run 通过一个 deployment来 演示 apiVersion: apps/v1 kind: Deployment metadata:name: deploylabels: app: deploy spec: replicas: 1selector: matchLabels:app: deploy-podt…...

uniapp/微信小程序实现加入购物车点击添加飞到购物车动画

1、预期效果 2、实现思路 每次点击添加按钮时&#xff0c;往该按钮上方添加一个悬浮元素&#xff0c;通过位移动画将元素移到目标位置。 1. 为每个点击元素设置不同的class&#xff0c;才能通过uni.createSelectorQuery来获取每个元素的节点信息&#xff1b; 2. 添加一个与…...

电商大数据的采集||电商大数据关键技术【基于Python】

.电商大数据采集API 什么是大数据&#xff1f; 1.大数据的概念 大数据即字面意思&#xff0c;大量数据。那么这个数据量大到多少才算大数据喃&#xff1f;通常&#xff0c;当数据量达到TB乃至PB级别时&#xff0c;传统的关系型数据库在处理能力、存储效率或查询性能上可能会遇…...

H264 SP帧等知识笔记

H.264是一种广泛使用的视频编码标准&#xff0c;它使用多种类型的帧来实现高效的视频压缩。在H.264中&#xff0c;参考帧和重建帧是两个重要的概念&#xff0c;它们之间既有区别又有联系。 参考帧&#xff1a; 参考帧是用于预测其他帧的帧。在H.264中&#xff0c;编码器会利用…...

流量印钞机:每日稳定收入1500+

标题&#xff1a;“流量印钞机&#xff1a;每日稳定收入1500” 随着互联网的迅速发展&#xff0c;越来越多的人开始利用网络平台来赚取稳定的收入。在这个信息爆炸的时代&#xff0c;拥有了一定的流量就意味着拥有了一台“印钞机”&#xff0c;可以每日稳定地创造超过1500元的…...

Tomcat中服务启动失败,如何查看启动失败日志?

1. 查看 localhost.log 这个日志文件通常包含有关特定 web 应用的详细错误信息。运行以下命令查看 localhost.log 中的错误&#xff1a; sudo tail -n 100 /opt/tomcat/latest/logs/localhost.YYYY-MM-DD.log请替换 YYYY-MM-DD 为当前日期&#xff0c;或选择最近的日志文件日…...

React19学习-初体验

升级react19版本 安装 npm install reactbeta react-dombeta如果使用ts则需要在package.json中添加。等正式版发布直接可以使用types/react了 "overrides": {"types/react": "npm:types-reactbeta","types/react-dom": "npm:ty…...

【UE5】数字人基础

这里主要记录一下自己在实现数字人得过程中涉及导XSens惯性动捕&#xff0c;视频动捕&#xff0c;LiveLinkFace表捕&#xff0c;GRoom物理头发等。 一、导入骨骼网格体 骨骼网格体即模型要在模型雕刻阶段就要雕刻好表捕所需的表情体(blendshape)&#xff0c;后面表捕的效果直…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...