嵌入式:QT Day4

news2024/9/28 17:24:47

一、手动完成服务器的实现,并注释具体步骤

源码:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

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

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void newConnnecttion_slot();              //自定义槽函数,用来处理有客户端发送连接请求后,服务器自动发送的newConnecttion信号
    void readyRead_slot();                    //自定义槽函数,用来处理客户端要向客户端发送信息时,客户端自动发送的readyRead信号

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;

    //定义服务器指针
    QTcpServer *server;
    //定义存储客户端套接字容器
    QList<QTcpSocket*> sockList;

};
#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_pushButton_clicked()
{
    //将行编辑器的内容赋值到port中
    quint16 port = ui->lineEdit->text().toUInt();

    //监听
    if(server->listen(QHostAddress::Any, port)){
        QMessageBox::information(this, "连接提示", "客户端连接成功!");
    }else{
        QMessageBox::information(this, "连接提示", "客户端连接失败!");
    }

    //此时服务器已经处于监听状态,如果有客户端发送连接请求,那么该服务器会自动发送newConnnecttion信号
    //我们可以将该信号连接到自定义的槽函数中,处理新套接字
    connect(server, &QTcpServer::newConnection, this, &Widget::newConnnecttion_slot);

}

void Widget::newConnnecttion_slot()
{
    //保存服务器接收到的客户端套接字指针
    QTcpSocket *s = server->nextPendingConnection();

    //将该套接字指针放到容器中
    sockList.push_back(s);

    //此时服务器与客户端已建立连接
    //如果客户端要向服务器发送信息,那么会发送一个readyRead信号
    //此时需要将该信号与自定义槽函数连接,读取客户端数据
    connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);

}

void Widget::readyRead_slot(){
    //移除无效客户端
    for(int i = 0; i < sockList.count(); i++){      //sockList.count()  表示存储客户端套接字的容器内元素个数
        if(sockList.at(i)->state() == 0){           //state表示客户端的状态,是一个枚举值,=0表示该客户端已断开连接
            sockList.removeAt(i);                   //移除该客户端
        }
    }

    //遍历客户端容器,判断是哪个客户端有数据要读
    for(int i = 0; i < sockList.count(); i++){
        if(sockList.at(i)->bytesAvailable() != 0){      //表示该客户端有数据要读
            //读取该客户端发送的全部信息
            QByteArray msg = sockList.at(i)->readAll();

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

            //将该消息发送给所有客户端
            for(int i = 0; i < sockList.count(); i++){
                sockList.at(i)->write(msg);
            }
        }
    }
}

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

二、思维导图

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

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

相关文章

vue-echarts配置项详解

起因 最近接手了一个vue3项目&#xff0c;echarts用的是"vue-echarts": “^6.0.0”&#xff0c;每次查看文档的时候痛苦不已&#xff0c;找一个配置要花费大量时间&#xff0c;所以这篇文章&#xff0c;主要就是为了记录比较常见的一些配置。 主要会写三种图的配置…

libcomposite: Unknown symbol config_group_init (err 0)

加载libcomposite.ko 失败 问题描述 如图&#xff0c;在做USB OTG 设备模式的时候需要用到libcomposite.ko驱动&#xff0c;加载失败了。 原因&解决方法 有一个依赖叫configfs.ko的驱动没有安装。可以从内核代码的fs/configfs/configfs.ko中找到这个驱动。先加载confi…

Linux学习之自定义函数

函数是把一些重复使用的命令封装成一个集合&#xff0c;之后可以使用函数名调用。 定义函数的格式如下&#xff1a; function 函数名() {指令集&#xff08;若干条语句&#xff09; return n }要是直接在Shell中直接定义函数&#xff0c;那么直接在Shell中直接使用函数名 参数…

建筑工地为什么要做人员定位?解读技术背后的安全与效益

建筑工地是一个复杂而危险的环境&#xff0c;人员安全一直是行业亟待解决的难题。为了确保工人的安全&#xff0c;并提高工地的管理效率&#xff0c;越来越多的建筑工地开始采用人员定位技术。 对此&#xff0c;华安联大便和各位朋友一起深入探讨人员定位技术的优势和功能&…

C++(14):重载运算与类型转换

当运算符被用于类类型的对象时&#xff0c;允许我们为其指定新的含义&#xff1b;同时&#xff0c;也能自定义类类型之间的转换规则。和内置类型的转换一样&#xff0c;类类型转换隐式地将一种类型的对象转换成另一种我们所需类型的对象。 当运算符作用于类类型的运算对象时&a…

一、创建自己的docker python容器环境;支持新增python包并更新容器;离线打包、加载image

1、创建自己的docker python容器环境 参考&#xff1a;https://blog.csdn.net/weixin_42357472/article/details/118991485 首先写Dockfile&#xff0c;注意不要有txt等后缀 Dockfile # 使用 Python 3.9 镜像作为基础 FROM python:3.9# 设置工作目录 WORKDIR /app# 复制当前…

了解网络层

网络层 1. 概述2. 网络层提供的两种服务2.1 面向连接的虚电路服务2.2 无连接的数据报服务2.3 虚电路服务 VS 数据报服务 3. IPv4地址及其应用3.1 分类编址的IPv4地址3.1.1 A类地址3.1.2 B类地址3.1.3 C类地址 3.2 划分子网的IPv4地址3.3 无分类编址的IPv4地址3.4 IPv4地址的应用…

出海品牌整合营销指南:打造全球化成功的关键策略

随着全球化的不断深入&#xff0c;越来越多的企业开始将目光投向海外市场&#xff0c;希望在国际舞台上展现自己的实力和魅力。然而&#xff0c;出海市场的竞争激烈&#xff0c;如何在陌生的土地上建立起品牌影响力&#xff0c;成为摆在出海企业面前的一大难题。在这样的背景下…

TD1850多用表校准系统参考标准

参考标准 分类 标准名称 国家标准 GB/T 13978-2008 数字多用表 GB/T 15637-2012 数字多用表校准仪通用规范 计量法规 JJF 1075-2015 钳形电流表校准规范 JJF 1284-2011 交直流电表校验仪校准规范 JJF 1587-2016 数字多用表校准规范 JJG 124-2005 电流表、电压表、功率表及…

苍穹外卖day02项目日志

1. 描述清楚新增员工的实现流程 1.1需求分析与设计 参考产品原型&#xff0c;设计表和接口。 1.1.1设计表 看员工管理的产品原型&#xff1a; 有员工姓名、账号、手机号、账号状态、最后操作时间等。 注意&#xff0c;操作一栏不是字段&#xff0c;其中的启用禁用才是。 再…

沦为囚犯的“烟草女王”卢平的管理口诀:大胆设计,小心求证

沦为囚犯的“烟草女王”卢平的管理口诀&#xff1a; 大胆设计&#xff0c;小心求证 卢平是当初是湖南烟草界女强人 大致2003年听到了一句话 在管理知识稀缺的年代 当初听了有点小激动 趣讲大白话&#xff1a;管理口诀有意思 【趣讲信息科技239期】 ***************************…

面试了一个在字节工作2年的“大佬”,我蚌埠住了

昨天面试了一位在字节跳动工作2年多的开发&#xff0c;简历上写的工作截止时间是“至今”。特意问了一下&#xff0c;才知道实际是六月份已经不在职了。面试也就进行了十多分钟&#xff0c;但想跟大家分享一些站在选人的视角如何看待面试中的一些问题。 先说说面试 首先肯定是…

不断学习和提高写作水平,使公文写作更加得心应手和高效精准

不断学习和提高写作水平&#xff0c;积累经验和技巧&#xff0c;是提高公文写作能力的重要方法。 具体来说&#xff0c;可以采取以下几个方面的工作&#xff1a; 1.学习范例&#xff1a;阅读优秀的公文范例&#xff0c;学习其写作技巧和语言风格&#xff0c;以丰富自己的写作经…

低代码开发平台源码

什么是低代码开发平台&#xff1f; 低代码来源于英文“Low Code&#xff0c;它意指一种快速开发的方式&#xff0c;使用最少的代码、以最快的速度来交付应用程序。通俗的来说&#xff0c;就是所需代码数量低&#xff0c;开发人员门槛低&#xff0c;操作难度低。一般采用简单的图…

如何将 LoRaWAN 用于比赛场景

如何将 LoRaWAN 用于比赛场景 关键词 LoRaWAN 实时上报 下行同步 不丢包 组播 应用场景 学生/运动员比赛&#xff0c;射击比武&#xff0c;同步采集等 摘要 为了将 LoRaWAN 应用于&#xff1a;比赛&#xff0c;比武&#xff0c;同步采集等场景&#xff0c;应对下行同步和…

cURL error 1: Protocol “https“ not supported or disabled in libcurl

1、php项目composer update报错 2、curl -V检查 发现curl已经支持了https了 3、php版本检查 4、php插件检查 插件也已经含有openssl组件了 5、phpinfo检查 curl是否开启ssl 定位到问题所在&#xff0c;php7.4的 curl扩展不支持 https 需要重装 php7.4的curl扩展 6、curl下载 下…

Feign API模块导入的两种方式

说明&#xff1a;在微服务框架中&#xff0c;会把其他微服务用到的FeignClient统一放到一个模块里面&#xff0c;称为FeignAPI&#xff0c;其他微服务需要使用FeignClient&#xff0c;引入FeignClient的Maven坐标就可以使用。 但是只引入FeignAPI的坐标还不行&#xff0c;Feig…

【分布式】分布式唯一 ID 的 几种生成方案以及优缺点snowflake优化方案

在互联网的业务系统中&#xff0c;涉及到各种各样的ID&#xff0c;如在支付系统中就会有支付ID、退款ID等。那一般生成ID都有哪些解决方案呢&#xff1f;特别是在复杂的分布式系统业务场景中&#xff0c;我们应该采用哪种适合自己的解决方案是十分重要的。下面我们一一来列举一…

数字化新时代,VR全景拍摄与制作

导语&#xff1a; 随着科技的飞速发展&#xff0c;数字化图片正在引领新的时代潮流。在这个数字化图片的新时代&#xff0c;VR全景拍摄与制作技术正以其独特的特点和无限的优势&#xff0c;成为数字影像领域的一颗璀璨明星。让我们深入了解VR全景拍摄与制作的特点和优势&#…

PLC绝对值指令ABS()

在C语言里,ABS()指令属于基础指令,博途PLC系统也有绝对值指令。对于S7-200SMART PLC则需要自行构造,下面给出SMART PLC的绝对值指令ABS()。 1、S7-SMART PLC绝对值指令 2、STL代码 SUBROUTINE_BLOCK ABS:SBR3 TITLE=ABS()函数 VAR_INPUT x:REAL; END_VAR VAR_OUTPUT y:RE…