4.11作业

news2025/2/24 3:03:53

服务器端

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpServer> //服务器端类
#include<QMessageBox> //消息对话框
#include<QTcpSocket> //客户端类
#include<QList> //链表容器

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_startBtn_clicked();

public slots:
    void newConnection_slot();
    void readyRead_slot();

private:
    Ui::Widget *ui;

    //实例化一个服务器指针
    QTcpServer *server;

    //定义一个存放客户端的容器
    QList<QTcpSocket *> socketList;

};
#endif // WIDGET_H

#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_startBtn_clicked()
{
    //获取ui界面端口号
    quint16 port = ui->portEdit->text().toUInt(); //将字符串转换成整型

    //让服务器设置监听

   if(server->listen(QHostAddress::Any,port))
   {
       //监听成功
       QMessageBox::information(this,"","启动服务器成功!");
   }
   else
   {
       //监听失败
       QMessageBox::information(this,"","启动服务器!");
       return;
   }

   //程序运行到这,说明服务器监听成功,有客户端发来连接请求,
   //那么服务器端就会自动发射一个newconnection()信号
   //那么就可以将该信号连接到自定义的槽函数中,处理逻辑代码
   connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);


}

//newConnection信号对应的槽函数
void Widget::newConnection_slot()
{
    //获取最新连接客户端的套接字
   QTcpSocket *s = server->nextPendingConnection();

   //将套接字 放入链表容器中
   socketList.push_back(s);

   //此时,说明服务器与客户端成功建立连接,如果

   connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}

//readyRead()信号对应槽函数
void Widget::readyRead_slot()
{
    //移除无效客户端
    for(int i=0;i<socketList.count();i++)
    {
        //判断客户端与服务器连接的状态
        if(socketList.at(i)->state() == 0)
        {
            //删除
            socketList.removeAt(i);
        }
    }

    //遍历容器,哪个有客户端有数据待读
    for(int i=0;i<socketList.count();i++)
    {
        //返回数据的大小:bytesAvailable()
        if(socketList.at(i)->bytesAvailable()>0)
        {
            //读取数据
           QByteArray msg = socketList.at(i)->readAll();
           //
           ui->listWidget->addItem(QString::fromLocal8Bit(msg));

           //将数据广播给所有客户端
           for(int j=0;j<socketList.count();j++)
           {
               socketList.at(j)->write(msg);
           }
        }
    }
}

客户端

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpSocket>




QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_connectBtn_clicked();

    void on_sendBtn_clicked();

    void on_disconnectBtn_clicked();

public slots:
    void connected_slot();
    void readyRead_slot();
    void disconnected_slot();

private:
    Ui::Widget *ui;

    //实例化客户端指针
    QTcpSocket *socket;

    //定义一个存储用户名的变量
    QString username;
};
#endif // WIDGET_H

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    , socket(new QTcpSocket(this))

{
    ui->setupUi(this);

    //初始化界面
    ui->msgEdit->setEnabled(false);
    ui->sendBtn->setEnabled(false);
    ui->disconnectBtn->setEnabled(false);
    connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);

}

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

//连接按钮对应的槽函数处理
void Widget::on_connectBtn_clicked()
{
    //获取到ui界面上的ip和端口号
    QString ip = ui->ipEdit->text();

    quint16 port = ui->portEdit->text().toUInt();
    //客户端连接服务器
    socket->connectToHost(ip,port);



}
//connected对应槽函数
void Widget::connected_slot()
{
    //告诉服务器我来了
    //组织语言
    username = ui->usernameEdit->text();
    QString msg = username+":进入聊天室";
    //将数据发送给服务器
    socket->write(msg.toLocal8Bit());

    //程序运行到这意味着服务器与客户端成功建立连接
    ui->msgEdit->setEnabled(true);
    ui->sendBtn->setEnabled(true);
    ui->disconnectBtn->setEnabled(true);

    ui->usernameEdit->setEnabled(false);
    ui->portEdit->setEnabled(false);
    ui->connectBtn->setEnabled(false);

    connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);

}
void Widget::readyRead_slot()

{
    //读取数据
    QByteArray msg = socket->readAll();

    //将读取到的数据放到ui界面上
    ui->listWidget->addItem(QString::fromLocal8Bit(msg));


}



//发送按钮对应的槽函数处理
void Widget::on_sendBtn_clicked()
{
    //获取Ui界面上的内容
    QString msg = ui->msgEdit->text();

    //组织语言
    msg = username + ":" + msg;
    socket->write(msg.toLocal8Bit());

    //清空内容
    ui->msgEdit->clear();

}

//断开与服务器连接的槽函数
void Widget::disconnected_slot()
{
    ui->msgEdit->clear();
    ui->sendBtn->setEnabled(false);
    ui->msgEdit->setEnabled(false);
    ui->disconnectBtn->setEnabled(false);
    ui->connectBtn->setEnabled(false);
}
//按下断开连接按钮的槽函数

void Widget::on_disconnectBtn_clicked()
{
    QString msg = username + "已退出聊天室";
    socket->write(msg.toLocal8Bit());
    socket->disconnectFromHost();
    connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}

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

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

相关文章

训练营第二十天(二叉树 part06)

训练营第二十天&#xff08;二叉树 part06&#xff09; 654.最大二叉树 力扣题目地址(opens new window) 题目 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出…

蓝桥杯第十三届c++大学B组详解

目录 1.九进制转十进制 2.顺子日期 3.刷题统计 4.修剪灌木 5.x进制的减法 6.统计子矩阵 7.积木画 8.扫雷 9.李白打酒 10.砍竹子 1.九进制转换十进制 题目解析&#xff1a;就是将2022的每一位拿出来乘以9的n-1次方的和就是最终答案。次方是从0开始的到n-1. #include &…

OpenLayers6实战,OpenLayers实现鼠标拖拽方式绘制平行四边形

专栏目录: OpenLayers实战进阶专栏目录 前言 本章介绍如何使用OpenLayers在地图上使用实现鼠标拖拽方式绘制平行四边形。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使用Yarn安装依赖yarn add olvue中如何使用: vue项目…

Unity单个物体绑定多个相机在轨道上移动,录制不同角度视频

环境搭建 下载Cinemachine插件安装 打开包管理器 下载cinemachine插件 创建轨道 使用dolly track 创建轨道 右侧可以删减关键点&#xff0c;注意调整y坐标 创建cart 把前面的轨道拖到path中&#xff0c;注意这里的speed要设定不为0才会动 设置VItual Camera 根据需…

win11 怎么去除桌面上的了解此图片

如上图,更新win11后换上了壁纸,却发现这么个鬼玩意儿,还没有删除选项 因为这个了解此图片,是win11个性化壁纸的功能 当你使用win11的壁纸选项是windows聚焦后,桌面就会出现这个 取消这个就行 选择纯色或者图片 就没有了,我干干净净的桌面

DAS-MIL

DAS-MIL论文笔记 题目&#xff1a;DAS-MIL: Distilling Across Scales for MIL Classification of Histological WSIs 摘要 近年来&#xff0c;采用多实例学习 &#xff08;MIL&#xff09; 对全玻片图像 &#xff08;WSI&#xff09; 进行分类的情况有所增加。事实上&#…

速锐得解码荣威新I5燃油版OBD数据助力驾校现代化数字教学

在当今这个信息化飞速发展的时代&#xff0c;技术的进步不仅改变了我们的生活方式&#xff0c;也深刻影响了各行各业的运作模式。驾驶教育行业亦是如此&#xff0c;其中&#xff0c;OBD&#xff08;On-Board Diagnostics&#xff0c;车载自动诊断系统&#xff09;数据的应用&am…

MySQL-mysql 8.0.11安装教程

网上的教程有很多&#xff0c;基本上大同小异。但是安装软件有时就可能因为一个细节安装失败。我也是综合了很多个教程才安装好的&#xff0c;所以本教程可能也不是普遍适合的。 安装环境&#xff1a;win 10 1、下载zip安装包&#xff1a; MySQL8.0 For Windows zip包下载地…

一篇文章让你搞懂性能测试6大类型及其关系!

性能测试是软件测试过程的一个关键环节&#xff0c;用于确定和验证应用程序或系统在各种操作条件下的性能特征。 目标是确保软件在高负载、高压力、长时间运行以及其他非标准情况下仍能保持预期的行为和效率。 一. 性能测试的主要类型 1. 基线测试&#xff08;Baseline Test…

引领车载影像革命,全链路解决方案助力座舱创新升级

影像技术的创新与突破正在引领各行各业的飞速发展&#xff0c;尤其对于汽车行业来说&#xff0c;车载影像系统已成为衡量车辆智能化水平的重要指标。为了满足这一日益增长的需求&#xff0c;美摄科技凭借深厚的研发实力与创新精神&#xff0c;推出了全链路的车载影像解决方案&a…

React 使用 three.js 加载 gltf 3D模型 | three.js 入门

系列文章 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制 示例项目(gitcode)&#xff1a;https://gitcode.com/qq_41456316/simple-react-three-demo 文章目录 系列文章前言一、three.js是什么&…

【简单讲解下Symfony框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

C++11 数据结构0 什么是 “数据结构“?数据,数据对象,数据元素,数据项 概念。算法的基本概念 和 算法的度量,大O表示法,空间换时间的代码

数据&#xff1a; 是能输入计算机且能被计算机处理的各种符号的集合。数值型的数据&#xff1a;整数和实数。非数值型的数据&#xff1a;文字、图像、图形、声音等。 数据对象&#xff1a; 性质相同的 "数据元素" 的集合 例如一个 int arr[10], Teacher tea[3]; 数…

算法:计数类dp

文章目录 一、举个栗子例子1&#xff1a;爬楼梯问题例子2&#xff1a;不同路径例子3&#xff1a;计数子序列 二、基本思路三、典型例题一、ACWing&#xff1a;900. 整数划分1、解法一1.1、状态转移方程1.2、参考代码 O(n) 超时 2、解法二&#xff1a;类似完全背包问题1.1、状态…

YOLOv8 推理脚本--置信度保留多位浮点数 特征图可视化

效果 特征图可视化: 4位浮点数: 原始2位浮点数4位浮点数推理 --detect.py 说明 在进行改动前,请大家先阅读下 基础入门篇 | YOLOv8 项目【训练】【验证】【推理】最简单教程 | YOLOv8必看 | 最新更新,直接打印 FPS,mAP50,75,95 ,确保会用我给的推理脚本。 YOLO( ):…

ChatGPT在日常生活与工作中的应用,以及Hulu AI 的探索之旅

ChatGPT在日常生活与工作中的应用&#xff0c;以及Hulu AI 的探索之旅 &#x1f4ac;ChatGPT 的多面应用&#x1f4ac;Hulu AI&#xff1a;一个AI工具聚合平台的探索平台优势为何选择Hulu AI&#xff1f;珍稀优惠 &#x1f4ac;结束语 在数字化快速发展的当下&#xff0c;人工智…

苍穹外卖开发笔记(1.项目介绍和开发环境)

目录 一、项目介绍二、环境搭建1、web管理端前端部署2、后端环境搭建3、数据库搭建4、前后端联调5、导入接口文档 三、完善登录功能四、学习知识1、前端发送的请求&#xff0c;是如何请求到后端服务的&#xff1f; 一、项目介绍 二、环境搭建 由于本项目主要点在于学习后端开发…

React + three.js 3D模型面部表情控制

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制 示例项目(github)&#xff1a;https://github.com/couchette/simple-react-three-facial-expression-demo 示例项目(gitcode)&#xff…

ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token

前言 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络上以 JSON 对象的形式安全地传输信息。 JWT 通常用于在用户和服务器之间传递身份验证信息&#xff0c;以便在用户进行跨域访问时进行身份验证。 JWT 由…

力扣--图论/Prim1584.连接所有点的最小费用

思路分析&#xff1a; 初始化&#xff1a;获取点的数量&#xff0c;并创建两个辅助数组 adjvex 和 lowcost&#xff0c;分别用于记录最小生成树的边信息和每个顶点到最小生成树的距离。Prim算法循环&#xff1a;在每一次循环中&#xff0c;选择一个未加入最小生成树的顶点 k&a…