9月12日的学习

news2024/11/24 21:04:24

练习

#include "widget.h"
#include "ui_widget.h"
QListWidgetItem *p;
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    ,socket(new QTcpSocket(this))//给客户端指针实例化空间及关联父组件
{
    ui->setupUi(this);
    //初始化,
    ui->msg_edit->setEnabled(false);
    ui->send_btn->setEnabled(false);
    ui->discon_btn->setEnabled(false);


//A
    connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
    //如果服务器向客户端发送数据,那么客户端自动发射readyRead()信号
    //我们就可以将该信号连接到自定义的槽函数中
    connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
    connect(socket,&QTcpSocket::disconnected,this,&Widget::discon_slot);
}

Widget::~Widget()
{
    delete p;
    p=nullptr;
    delete ui;
}

//连接服务器按钮对应的槽函数
void Widget::on_link_btn_clicked()
{
    //获取ui界面上的IP和端口号

    QString IP= ui->ip_edit->text();
    quint16 port=ui->port_edit ->text().toUInt();



    //让客户端连接服务器
    //virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);
    //1、参数1:连接服务器的ip地址
    //2、参数2:端口号

    socket->connectToHost(IP,port);

    //如果客户端成功连接服务器,那么客户端就会自动发射一个connected信号
//  go to A   我们将此信号连接到自定义的槽函数处理逻辑代码,由于只需要连接溢出,所以连接函数写在构造函数、

}

//连接成功的槽函数
void Widget::connected_slot()
{
       //告诉服务器 我来了
    usrname=ui->usr_edit->text();
    QString msg=usrname + " 进入聊天室";
    //将信息发送给服务器
    ui->msg_edit->setEnabled(true);
    ui->send_btn->setEnabled(true);
    ui->discon_btn->setEnabled(true);


    ui->ip_edit->setEnabled(false);
    ui->port_edit->setEnabled(false);
    ui->usr_edit->setEnabled(false);
    ui->link_btn->setEnabled(false);
    socket->write(msg.toLocal8Bit());


}


//发送按钮对应的槽函数
void Widget::on_send_btn_clicked()
{
    //获取ui界面的文本
    QString msg=usrname +":" +ui->msg_edit->text();
    //将信息发送给服务器
    socket->write(msg.toLocal8Bit());
    //放入ui界面上
    msg=ui->msg_edit->text()+":" +usrname;
    p=new QListWidgetItem(msg);
    p->setTextAlignment(Qt::AlignRight);
        ui->listWidget->addItem(p);




    ui->msg_edit->clear();
}


//客户端接受处理服务器发来的数据
void Widget::readyRead_slot()
{
     QByteArray msg  = socket->readAll();
     //将读取到的信息放入ui界面上
     ui->listWidget->addItem(QString::fromLocal8Bit(msg));

}
//客户端断开连接
void Widget::on_discon_btn_clicked()
{
    //告诉服务器我走了
    QString msg=usrname+ "离开聊天室";
    socket->write(msg.toLocal8Bit());
    socket->disconnectFromHost();

//如果成功与服务器断开连接
    //那么客户端自动发射disconnected信号
    //我们就可以将该信号连接到自定义槽函数中处理后续逻辑代码
    //由于只需要连接一次,所以连接函数写在构造函数 中

}

void Widget::discon_slot()
{


    ui->msg_edit->setEnabled(false);
    ui->send_btn->setEnabled(false);
    ui->discon_btn->setEnabled(false);


    ui->ip_edit->setEnabled(true);
    ui->port_edit->setEnabled(true);
    ui->usr_edit->setEnabled(true);
    ui->link_btn->setEnabled(true);
}

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    ,server(new QTcpServer(this))//给服务器指针实例化一片空间,关联父组件,不用担心工程结束释放的问题
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

//启动服务器按钮的槽函数
void Widget::on_start_btn_clicked()
{
    //获取ui界面端口号
    quint16 port= ui->port_edit->text().toUInt();

    //启动服务器
    //服务器设置监听
    //bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
    //1、参数 1:监听的主机,可以是任意,可以是指定
    //2、参数2 :监听的端口号
    //返回值监听成功返回true,监听失败返回false
    if(server->listen(QHostAddress::Any,port))
    {
        //监听成功
        QMessageBox::information(this,"","启动服务器成功");
        ui->start_btn->setEnabled(false);
    }
    else
    {
        //监听失败
        QMessageBox::information(this,"","启动服务器失败");
        return;
    }
    //程序运行至此,说明监听成功,如果有客户端发来连接请求,那么服务器就会自动发射一个newConnection信号
    //我们可以将信号连接到自定义的槽函数中,处理相关逻辑代码
    connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}

void  Widget::newConnection_slot()
{
    //只要有任意客户端发来连接请求,服务器发送一个newConnnection信号,该槽函数自动响应
    //获取最新连接客户端的套接字
    //virtual QTcpSocket *nextPendingConnection();
    QTcpSocket* s= server->nextPendingConnection();

    //将客户端套接字放入客户端容器中
    socketList.push_back(s);//尾插
    //此时说明客户端和服务器已经建立了连接,如果客户端向服务器发来数据,那么客户端就会自动发射一个readyRead()信号
    //此时可以将信号连接到自定义的槽函数中,读取客户端的数据
    connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);//
}

//readyRead对应的槽函数
void Widget::readyRead_slot()
{
    //读取客户端的数据
    //遍历客户端容器,移除无效客户端
                 //元素个数
    for(int i=0;i<socketList.count();i++)
    {
        //判断客户端和服务器连接的状态
        //SocketState state() const;
        if(socketList.at(i)->state()==0)
        {
            //未连接,移除
            socketList.removeAt(i);
        }
    }

    //遍历客户端容器,判断哪个客户端有数据待读
    for(int i=0;i<socketList.count();i++)
    {
        //判断哪个客户端有数据可读
        //qint64 bytesAvailable() const override;
                //接受数据的字节大小
        if(socketList.at(i)->bytesAvailable()!=0)
        {
                //读取数据
            QByteArray msg  = socketList.at(i)->readLine();
              //将读取到的数据放入到ui界面
            ui->listWidget->addItem(QString::fromLocal8Bit(msg));
                //将数据广播给所有客户端
        for(int j=0;j<socketList.count();j++)
        {

            socketList.at(j)->write(msg);

        }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习大数据DAY56 业务理解和第一次接入

作业1 1 了解行业名词 ERP CRM OA MES WMS RPA SAAS 了解每个系统的功能和应用 ERP 系统&#xff0c;&#xff08;Enterprise Resource Planning&#xff0c;企业资源计划系统&#xff09;&#xff1a;ERP 系统 是一种用于管理企业各类资源的软件系统&#xff0c;包括生产管理…

2024年软件测试经典大厂面试题(全3套)【包含答案】

前言 金三银四即将过去&#xff0c;后面迎来的便是金九银十&#xff0c;一直想着说分享一些软件测试的面试题&#xff0c;这段时间做了一些收集和整理&#xff0c;下面共有三篇经典面试题&#xff0c;大家可以试着做一下&#xff0c;答案附在后面&#xff0c;希望能帮助到大家。…

STM32——玩转超声波传感器

目录 1.什么是超声波&#xff1f; 超声波的基本特点&#xff1a; 2.超声波传感器介绍&#xff1a;HC-SR04 HC-SR04 主要特点&#xff1a; HC-SR04 接线如下&#xff1a; HC-SR04 工作原理&#xff1a; 如何编写超声波测距代码&#xff1f; 编写逻辑&#xff1a; 编写思…

【2024】前端学习笔记4-图像标记

在 HTML 中&#xff0c;<img>标签用于在网页中插入图像。 基本语法&#xff1a; <img src"图像文件地址" alt"替代文本">src&#xff1a;指定图片的路径&#xff0c;可以是相对路径、绝对路径。alt&#xff1a;为图像提供代替文本&#xff0…

9.12日常记录

1.extern关键字 1&#xff09;诞生动机:在一个C语言项目中&#xff0c;需要再多个文件中使用同一全局变量或是函数&#xff0c;那么就需要在这些文件中再声明一遍 2&#xff09;用于声明在其他地方定义的一个变量或是函数&#xff0c;在当前位置只是声明&#xff0c;告诉编译器…

【办公类】幼儿健康数据模版批量更改日期(保健老师填写)

背景需求 今天下发通知 三个园区的保健老师需要填写 1.2023学年&#xff08;202406&#xff09;的六一体检数据 2.2024学年&#xff08;202409&#xff09;的新生入园体检数据 我先把上一轮填写过的数据模版下载下来&#xff08;套用模版&#xff09; 把EXCEL下载到原始文件…

驾驭不断发展的人工智能世界

从很多方面来看&#xff0c;历史似乎正在重演。许多企业正争相采用生成式人工智能 (Gen AI)&#xff0c;就像它们争相采用云计算一样&#xff0c;原因也是一样的&#xff1a;效率、成本节约和竞争优势。 然而&#xff0c;与云一样&#xff0c;GenAI 仍是一项发展中的技术&…

机器学习(西瓜书)第 9 章 聚类

9.1 聚类任务和距离计算 在”无监督学习“中&#xff0c;训练样本的标记信息是未知的&#xff0c;目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律&#xff0c;为进一步的数据分析提供基础.此类学习任务中研究最多、应用最广的是“聚类”(clustering). 聚类试图…

咖啡果实病虫害检测系统源码分享

咖啡果实病虫害检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

【最新综述】基于深度学习的超声自动无损检测(上)

Deep learning in automated ultrasonic NDE – Developments, axioms and opportunities 传统上&#xff0c;超声无损检测数据分析一直由训练有素的操作员在基本自动化工具的支持下手动解释数据。最近&#xff0c;开始出现许多针对个别无损检测任务&#xff08;数据预处理、缺…

即插即用篇 | YOLOv10 引入矩形自校准模块RCM | ECCV 2024

本改进已同步到YOLO-Magic框架! 语义分割是许多应用的重要任务,但要在有限的计算成本下实现先进性能仍然非常具有挑战性。在本文中,我们提出了CGRSeg,一个基于上下文引导的空间特征重建的高效且具有竞争力的分割框架。我们精心设计了一个矩形自校准模块,用于空间特征重建和…

HarmonyOS开发实战( Beta5.0)橡皮擦案例实践详解

鸿蒙HarmonyOS开发往期必看&#xff1a; HarmonyOS NEXT应用开发性能实践总结 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; 介绍 本示例通过ohos.graphics.drawing库和blendMode颜色混合实…

Obsidian git sync error / Obsidian git 同步失敗

Issue: commit due to empty commit message Solution 添加commit資訊&#xff0c;確保不留空白 我的設置&#xff1a;auto-backup: {{hostname}}/{{date}}/

ESXI8.0 vsphere vcenter 多网卡多网段配置

一般来说服务器至少两块网卡&#xff0c;安装esxi后一种方案是利用闲置网卡建立多上传链路&#xff0c;聚合&#xff0c;另一种是配置多网段进行虚拟机隔离&#xff0c;网上也没找到讲的很清楚的&#xff0c;经过多种尝试终于学会&#xff0c;记录分享一下 首先物理交换机的随…

谷歌开发者账号被封会影响AdMob吗?收款卡更换修改有什么限制?

众所周知&#xff0c;AdMob作为谷歌旗下的广告平台&#xff0c;是众多开发者的主要变现渠道之一。那在开发者账号被封的情况下&#xff0c;AdMob账号是否会也受到波及&#xff1f; 虽说通常谷歌开发者账号被封并不直接等同于AdMob账号被封&#xff0c;但还是会互相影响的。即使…

C 和 C++ struct 的区别?

目录 1. 默认访问权限 2. 面向对象特性 3. 继承和多态 4. 访问控制 5. 使用习惯 6. 默认继承权限 1. 默认访问权限 C 语言&#xff1a;在 C 中&#xff0c;struct 中的所有成员默认是 public&#xff08;可直接访问&#xff09;。C 语言&#xff1a;在 C 中&#xff0c;…

BFS广度优先搜索解决迷宫问题

前言 BFS广度优先搜索解决迷宫问题 迷宫问题 原题目&#xff1a;迷宫由n行m列的单元格组成(n,m都小于等于50)&#xff0c;每个单元格要吗是空地要吗是障碍物。现在请你找到一条从起点到终点的最短路径长度。 分析 首先我们将起点入队&#xff0c; 然后队首节点可拓展的点入…

总线性能指标及标准

一、总线性能指标 1.总线周期 一次总线操作所需的时间&#xff08;包括申请阶段、寻址阶段、传输阶段和结束阶段&#xff09;&#xff0c;通常 由若干个总线时钟周期构成。 2.总线时钟周期 即机器的时钟周期。计算机有一个统一的时钟&#xff0c;以控制整个计算机的各个部件…

Android 系统下:普通应用无缝安装,Launcher 应用安装遭遇罕见障碍解析

目录 一、场景 1.1 错误分析 1.2 解决方法尝试 1.2.1 检查应用的安装位置 1.2.2 使用ADB安装 1.2.3 检查APK的签名 1.2.4 检查可用的内部存储空间 1.2.5 将应用程序安装到设备的内部存储空间 1.2.6 重置设备&#xff08;谨慎使用&#xff09; 1.2.7 获取Root权限&…

【Qt】选择器

选择器概况 QSS选择器支持以下几种&#xff1a; 选择器示例说明 全局选择器 * 选择所有的 widget. 类型选择器 (type selector) QPushButton 选择所有的 QPushButton 和 其⼦类 的控件. 类选择器 (class selector) .QPushButton 选择所有的 QPushButton 的控件. 不会选…