DAY4,Qt(事件处理机制的使用,Qt中实现服务器的原理)

news2024/11/16 5:33:07

1.Qt中实现服务器的原理;

---chatser.h---头文件
#ifndef CHATSER_H
#define CHATSER_H

#include <QWidget>
#include <QTcpServer>  //服务器类
#include <QTcpSocket>  //套接字类
#include <QMessageBox>  //消息对话类
#include <QList>  //链表容器
#include <QDebug>  //信息调试类

QT_BEGIN_NAMESPACE
namespace Ui { class Chatser; }
QT_END_NAMESPACE

class Chatser : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_start_btn_clicked();  //启动服务器按钮槽函数
    void newConnection_slot();  //处理cli连接信号槽
    void readyRead_slot();  //处理cli发送数据信号槽

private:
    Ui::Chatser *ui;

    QTcpServer *server;  //定义服务器指针
    QList<QTcpSocket*> socketList;  //定义客户端容器
};
#endif // CHATSER_H
---chatser.cpp---函数实现文件
#include "chatser.h"
#include "ui_chatser.h"

Chatser::Chatser(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Chatser)
{
    ui->setupUi(this);

    server = new QTcpServer(this);  //给服务器指针实例化空间
}

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

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

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

    //如果有客户端发来连接请求,那么该服务器就会自动发射一个newConnection信号
    //将客户端连接信号与对应槽函数连接
    connect(server,&QTcpServer::newConnection,this,&Chatser::newConnection_slot);
}

//处理cli连接信号槽
void Chatser::newConnection_slot()
{
    qDebug()<<"有新客户端连接";
    //获取最新连接的客户端套接字
    QTcpSocket *s = server->nextPendingConnection();

    //将套接字放入客户端容器中
    socketList.push_back(s);

    //如果有客户端向服务器发来数据,那么该客户端会自动发射一个readyRead信号
    //将客户端发送数据信号与对应槽函数连接
    connect(s,&QTcpSocket::readyRead,this,&Chatser::readyRead_slot);
}

//处理cli发送数据信号槽
void Chatser::readyRead_slot()
{
    //移除无效客户端
    for(int i=0; i<socketList.count(); i++)
    {
        if(socketList.at(i)->state() == 0)  //state函数返回值为枚举值,
        {                                   //0表示无效连接
            socketList.removeAt(i);
        }
    }

    //遍历客户端套接字,寻找哪个客户端有数据待读
    for(int i=0; i<socketList.count(); i++)
    {
        if(socketList.at(i)->bytesAvailable() != 0)
        {
            //读取数据
            QByteArray msg = socketList.at(i)->readAll();

            //将数据展示到ui界面
            ui->msg_Widget->addItem(QString::fromLocal8Bit(msg));

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

}










---main.cpp---测试文件
#include "chatser.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Chatser w;
    w.show();
    return a.exec();
}
结果展示--- 

 

2.今日思维导图;

 

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

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

相关文章

机器学习深度学习——模型选择、欠拟合和过拟合

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——多层感知机的简洁实现 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有…

HHDESK便捷功能介绍三

1 连接便捷显示 工作中&#xff0c;往往需要设置很多资源连接。而过多的连接设&#xff0c;往往很容易混淆。 在HHDESK中&#xff0c;当鼠标点击连接时&#xff0c;会在下方显示本连接的参数&#xff0c;方便用户查看。 2 日志查看 实际工作中&#xff0c;查看日志是一件很…

干货 | 5个经典的模拟电路解析,电子人必看!

干货 | 5个经典的模拟电路解析&#xff0c;电子人必看&#xff01; 作为一个电子人&#xff0c;我们平时需要和不同的电路接触&#xff0c;但有一些电路图是经典的&#xff0c;值得我们永远记住。一、自举电路 此电路用在各种ADC之前的采样电路&#xff0c;可以让ADC实现轨到轨…

lc154.寻找旋转排序数组中的最小值

最小元素的位置以旋转次数为索引的位置&#xff0c;但是没有告诉旋转次数&#xff0c;换一种思路 当遇到arr[index] > arr[index1]时&#xff0c;index1为最小元素的位置。首位位置独立比较。但是这种方法还是遍历数组 观察两组数的中间值与首尾的值&#xff0c;又由于数组…

变现:利用 chatgpt + midjourney 制作微信表情包

1、利用gpt生成提示词&#xff0c;当然也可以直接翻译 生成基础提示词&#xff0c; 比如&#xff1a; an anime image with a white kawaii character in it, in the style of light green and brown, minimalist detail, animated gifs, cranberrycore, 1860–1969, babyco…

企业做数字化转型,请先避开这5个坑!

前言&#xff1a; “多种薪酬结构并存”的中国企业&#xff0c;在面临线下算薪、线上算税、表格数据整理易出错的问题时&#xff0c;有没有高效的解决办法&#xff1f;在考勤记录需要结合纸质版假条核对时&#xff0c;怎样减少人事的工作量&#xff1f;企业在积累了海量业务数…

【探讨】Java POI 处理 Excel 中的名称管理器

前言 最近遇到了一些导表的问题。原本的导表工具导不了使用名称管理器的Excel。 首先我们有两个Sheet。B1用的是名称管理器中的AAA, 而B2用的对应的公式。 第二个sheet&#xff0c;名为Test2: 这是一段简化的代码&#xff1a; public class Main {public static void mai…

Rust ESP32C3开发

Rust ESP32C3开发 系统开发逐步使用Rust语言&#xff0c;在嵌入式领域Rust也逐步完善&#xff0c;本着学习Rust和ESP32的目的&#xff0c;搭建了ESP32C3的环境&#xff0c;过程中遇到了不少问题&#xff0c;予以记录。 ESP-IDF开发ESP32 这一部分可跳过&#xff0c;是使用C开…

浏览器中的Markdown编辑器StackEdit

目前博客的 Pageviews 大约是之前的 10%&#xff0c;而 Uniques 则大约是 15% 左右。看来很多同学已经彻底迷路了 大家可以关注CSDN&#xff0c;地址&#xff1a; https://blog.csdn.net/wbsu2004 微信公众号也可以关注起来 什么是 StackEdit &#xff1f; StackEdit 是基于 P…

pyspark 笔记 cast 转换列的类型

1 不借助 pyspark.sql.types from pyspark.sql.functions import coldata [("Alice", "28"), ("Bob", "22"), ("Charlie", "30")] columns ["name", "age_str"] df spark.createDataFram…

如何使用vscode连接远程服务器

1、安装remote-ssh 在应用商店搜索remote-ssh&#xff0c;安装remote-ssh 2、安装完成后会出现远程资源管理器 3、点击远程资源管理器 --ssh的➕号&#xff0c;在输出框内输入要连接的服务器ip及账户名 如&#xff1a;ssh 账户名ip地址 4、输入后回车保存 5、保存后刷新一下 6…

SOLIDWORKS磁力配合工具

在我们平常的工作中&#xff0c;很多人都会面临大型装配体相互配合的问题。有很多用户&#xff0c;由于设计的产品体积很大&#xff0c;零件数量非常多。即使将设备分成不同的部件进行组装&#xff0c;不同的部件之间进行配合也非常困难。因为这种时候软件运行的速度会变得非常…

【UE5 多人联机教程】06-显示玩家名称

效果 可以看到玩家输入各自的名称&#xff0c;会显示到自己控制的角色头上。但是目前有一个BUG就是&#xff0c;当客户端加入游戏时会多创建一个服务端的角色。 步骤 1. 打开“BP_ThirdPersonCharacter”&#xff0c;添加一个控件组件&#xff0c;用于显示玩家名称 作为网格体…

国产内存惹人爱,光威的价格战太凶猛,海外品牌已无力招架

现阶段&#xff0c;真的很适合升级内存条和SSD&#xff01;当然了&#xff0c;我说的是国产的品牌&#xff0c;经过这几年的发展&#xff0c;国产内存和SSD的表现都有了质的飞跃&#xff0c;像是光威之类的品牌&#xff0c;更是成功在玩家群体中获得了良好的口碑&#xff0c;而…

数据库的介绍

无处不在的数据库 信息化社会&#xff0c;无处不在的就是数据。 编程语言可以归纳为&#xff0c;数据的计算一类。 那数据的存储呢? 数据库就是存储数据的库&#xff0c;那么它是如何组织数据并存储的呢? 数据库如何存储数据 我们先来看看&#xff0c;生活中&#xff0c;…

通过社区参与解锁早期增长:Maven 远程医疗平台概览

Maven通过用户导向的渐进式验证&#xff0c;找到了一个被忽视的巨大女性医疗服务市场&#xff0c;作为女性医疗保健的先行者&#xff0c;已服务超过1500万用户&#xff0c;目前估值已达$14亿。本文将深入探索Maven实现产品市场匹配的三个阶段&#xff0c;从如何验证初始的市场机…

Junit5 + YAML 轻松实现参数化和数据驱动(一)

登录&#xff1a;不同的用户名&#xff0c;不同的密码&#xff0c;不同的组合都需要做登录场景的测试&#xff0c;正常的排列组合下可能会产生多个用例 搜索&#xff1a;不同的搜索条件产生不同的搜索结果&#xff0c;搜索也是常见的测试项&#xff0c;单个搜索参数或者多种搜…

手动搭建gateway,项目集成gateway实现Token效果

目录 背景步骤1、首先创建springboot项目2、引入依赖3、配置文件&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;超级重要&#xff01;&#xff01;&#xff01;根据自己的需要进行配置&#xff09;4、相关类我们在服务中进行的白名单中接口的操作如…

Java8 LocalDate、Date、LocalDateTime、时间戳的转换

文章目录 LocalDateplusminus比较日期 LocalDate、Date、LocalDateTime、时间戳的转换 LocalDate plus LocalDate localDate2 localDate1.plus(15, ChronoUnit.DAYS);LocalDate localDate2 localDate1.plus(Period.ofDays(15));minus LocalDate localDate2 localDate1.minu…

电缆振荡波局部放电检测定位技术

电缆振荡波检测技术主要用于交联聚乙烯电力电缆检测&#xff0c;是属于离线检测的一种有效形式 。该技术基于LCR阻尼振荡原理&#xff0c;在完成电缆直流充电的基础上&#xff0c;通过内置的高压电抗器、高压实时固态开关与试品电缆形成阻尼振荡电压波&#xff0c;在试品电缆上…