QT--聊天室

news2024/9/9 0:29:48

一、设计要求

用QT做一个聊天室,

制作一个服务器和客户端。可以进行注册、登录,

登陆成功后可以使用昵称进行发送、接收消息。

能根据昵称、聊天内容查询历史记录,也可以查询全部聊天记录。

二、客户端三级ui界面

三、项目代码

//在pro文件里加入
QT       += core gui network
RC_FILE += icon_config.rc
//客户端dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QtWidgets>
#include <QDebug>
// 网络连接类
#include <QTcpSocket>
// 文本流
#include <QTextStream>
#include <QDateTime>
#include <QByteArray>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    QTcpSocket *client;
    void printMsg(QString); // 输出内容到公屏
    void succRight();

private slots:
    void btnConnClickedSlot(); // 连接按钮
    void btnSendClickedSlot(); // 发送按钮
    void connectedSlot(); // 连接成功的槽函数
    void disconnectedSlot(); // 断开连接的槽函数
    void readReadSlot(); // 接收数据的槽函数

    void btnHisClickedSlot();//历史记录
    void btnHisNameClickedSlot();//按照昵称
    void btnHisNeiClickedSlot();//按照内容

    void btnLoginClickedSlot();//登录/切换窗口

    void btnRegClickedSlot();//注册



};

#endif // DIALOG_H
//客户端dialog.c
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    // 抢前台
    setWindowFlags(Qt::WindowStaysOnTopHint);

    connect(ui->pushButtonConn,SIGNAL(clicked()),
            this,SLOT(btnConnClickedSlot()));
    connect(ui->pushButtonSend,SIGNAL(clicked()),
            this,SLOT(btnSendClickedSlot()));

    client = new QTcpSocket(this);
    // 建立网络连接检测的信号槽
    connect(client,SIGNAL(connected()),
            this,SLOT(connectedSlot()));
    connect(client,SIGNAL(disconnected()),
            this,SLOT(disconnectedSlot()));
    // 接收消息的信号槽
    connect(client,SIGNAL(readyRead()),
            this,SLOT(readReadSlot()));
//历史
    connect(ui->pushButtonHis,SIGNAL(clicked()),
            this,SLOT(btnHisClickedSlot()));
    connect(ui->pushButtonName,SIGNAL(clicked()),
            this,SLOT(btnHisNameClickedSlot()));
    connect(ui->pushButtonNei,SIGNAL(clicked()),
            this,SLOT(btnHisNeiClickedSlot()));


    //切换窗口:登录
    connect(ui->pushButtonLo,SIGNAL(clicked()),
            this,SLOT(btnLoginClickedSlot()));
    //注册
    connect(ui->pushButtonReg,SIGNAL(clicked()),
            this,SLOT(btnRegClickedSlot()));

}

Dialog::~Dialog()
{
    disconnect(client,SIGNAL(disconnected()),
               this,SLOT(disconnectedSlot()));
    // 如果还在连接
    if(client->isOpen())
        client->close();
    delete ui;
}

void Dialog::btnConnClickedSlot()
{
    // 发起连接请求
    // 默认用户输入的参数都对
    client->connectToHost(ui->lineEditIp->text(),ui->spinBox->value());
}

void Dialog::printMsg(QString msg)
{
    // 获得当前时间
    QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh:mm:ss");
    ui->textBrowser->append(time);
    ui->textBrowser->append(msg);
    ui->textBrowser->append("");
}

void Dialog::succRight()
{
  ui->stackedWidget->setCurrentIndex(1);
}

void Dialog::btnSendClickedSlot()
{
    // 获得昵称和消息内容
    QString user = ui->lineEditUser->text();
    if(user=="")
    {
        QMessageBox::warning(this,"提示","请输入昵称!");
        return;
    }
    QString msg = ui->lineEditMsg->text();
    if(msg == "")
    {
        QMessageBox::warning(this,"提示","请输入要发送的消息!");
        return;
    }
     QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss");
    // 创建文本流对象
    QTextStream output(client);
    // 连续输出发送
    output << time<<":"<<user << ":" << msg;
    // 清空消息输入框
    ui->lineEditMsg->clear();
    // 公屏显示
    msg = user+QString("(本机):")+msg;
    printMsg(msg);
}

void Dialog::connectedSlot()
{
    // 屏蔽连接按钮,开启发送按钮
    ui->pushButtonConn->setEnabled(false);
    ui->pushButtonConn->setText("已连接");
    ui->pushButtonSend->setEnabled(true);
    ui->stackedWidget->setCurrentIndex(1);
}

void Dialog::readReadSlot()
{


    QTextStream input(client);
    QString text = input.readAll();
    QString text1=input.readLine(100);

    qDebug() <<text1;
    QStringList list = text.split(":");
    QStringList list2 = text1.split(":");
    qDebug()<<"分割后数量"<<list.size();

     qDebug() <<list2.size();

    if(list.size()<4)
    {
    if(text=="dlchengg")
    {
        qDebug() <<text;
        ui->stackedWidget->setCurrentIndex(2);
        ui->textBrowser->clear();
    }
//    else if(list.size()==3)
//    {


//        ui->textBrowser_2->append(text);
//        return;
//    }
    else
    {
    printMsg(text);
    }
    }
    else if(list.size()>=4)
    {

        ui->textBrowser_2->append(text);
        return;
    }
}

void Dialog::btnHisClickedSlot()
{
     ui->textBrowser_2->clear();
    QString user = ui->lineEditUser->text();
    if(user=="")
    {
        QMessageBox::warning(this,"提示","请输入昵称!");
        return;
    }

     QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss");
    // 创建文本流对象

    QTextStream output(client);
    QString mm="历史记录";
    output<< time<<":"<<user << ":" <<mm ;
}

void Dialog::btnHisNameClickedSlot()
{
     ui->textBrowser_2->clear();
    QString user = ui->lineEditUser->text();


     QString time = "hh";
    // 创建文本流对象

    QTextStream output(client);
    QString mm="按照昵称";
    output<< time<<":"<<user << ":" <<mm ;
}

void Dialog::btnHisNeiClickedSlot()
{
    ui->textBrowser_2->clear();
    QString user = "sjdhs";
     QString time = "按照内容";
    // 创建文本流对象
     QString msg = ui->lineEditMsg->text();
     if(msg == "")
     {
         QMessageBox::warning(this,"提示","请输入要发送的消息!");
         return;
     }
    QTextStream output(client);

    output<< time<<":"<<user << ":" <<msg ;
}

void Dialog::btnLoginClickedSlot()
{
    QString user = ui->lineEditUs->text();
    if(user=="")
    {
        QMessageBox::warning(this,"提示","请输入昵称!");
        return;
    }
    QString pwd = ui->lineEdit_2Pwd->text();
    if(pwd == "")
    {
        QMessageBox::warning(this,"提示","请输入密码!");
        return;
    }

    // 创建文本流对象
    QTextStream output(client);
    // 连续输出发送
    QString mag="hha";
    QString haf="lele";
    output <<user << ":" << pwd<<":"<<mag<<":"<<haf;



}

void Dialog::btnRegClickedSlot()
{
    QString user = ui->lineEditUs->text();
    if(user=="")
    {
        QMessageBox::warning(this,"提示","请输入昵称!");
        return;
    }
    QString pwd = ui->lineEdit_2Pwd->text();
    if(pwd == "")
    {
        QMessageBox::warning(this,"提示","请输入密码!");
        return;
    }

    // 创建文本流对象
    QTextStream output(client);
    // 连续输出发送
    output <<user << ":" << pwd;
}

void Dialog::disconnectedSlot()
{
    // 开启连接按钮,屏蔽发送按钮
    ui->pushButtonConn->setEnabled(true);
    ui->pushButtonConn->setText("连接");
    ui->pushButtonSend->setEnabled(false);
    // 弹窗
    printMsg("连接已断开!");
    QMessageBox::warning(this,"提示","连接已断开!");
    ui->stackedWidget->setCurrentIndex(0);
}
//服务器dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QtWidgets>
#include <QDebug>
// 连接管理类
#include <QTcpServer>
#include <QDateTime>
// 连接类
#include <QTcpSocket>
// 文本流
#include <QTextStream>

#include <QButtonGroup>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QMessageBox>
#include <QSqlQuery>
#include <QByteArray>


namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    QTcpServer* server; // 管理对象(母鸡)
    void printMsg(QString); // 输出内容到公屏
    QTcpSocket* socket = NULL; // 连接对象(绿蛋)
    QList<QTcpSocket*> sockets;
    QList<QString> ips;

    QSqlDatabase db;

      void connect2DB(); // 连接到数据库1

      void createTable();// 建表
      void createTable2();
      void insertData(); // 插入数据
      void selectAll(int);  // 数据全查
      void selectLOgin(QString,QString,int);
       void selectName(QString,int);
        void selectNei(QString,int);

private slots:
    // 新连接来了的槽函数
    void newConnSlot();
    // 连接掉线的信号槽
    void disconnetedSlot();
    // 有数据可读时的槽函数
    void readyReadSlot();

};

#endif // DIALOG_H
//服务器dialog.c
#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    // 抢前台
    setWindowFlags(Qt::WindowStaysOnTopHint);

    server = new QTcpServer(this);
    // 连接新连接来了的信号槽
    connect(server,SIGNAL(newConnection()),
            this,SLOT(newConnSlot()));

    // 开启监听服务
    server->listen(QHostAddress::Any,8887);

    connect2DB();
}

Dialog::~Dialog()
{
    if(server->isListening()) // 如果还在监听
        server->close();
    delete ui;
}

void Dialog::printMsg(QString msg)
{
    // 获得当前时间
    QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    ui->textBrowser->append(time);
    ui->textBrowser->append(msg);
    ui->textBrowser->append("");
}

void Dialog::connect2DB()
{
    // 创建连接对象
      db = QSqlDatabase::addDatabase("QSQLITE");
      // 设置数据库的文件名称
      db.setDatabaseName("book_management.db");
      // 打开数据库
      if(db.open())
      {
          qDebug() << "连接成功";

         // createTable();
         // createTable2();
      }
      else
      {
          // 获得错误信息封装类
          QSqlError info = db.lastError();
          // 提取错误文本
          QString text = info.text();
          // 展示错误
          QMessageBox::critical(this,"错误",text);
      }

}

void Dialog::createTable()
{

    QString sql = "CREATE TABLE book(time TEXT PRIMARY KEY,name TEXT,msg TEXT);";

      // 创建数据库操作类对象
      QSqlQuery sq;

      if(sq.exec(sql))
      {
          qDebug() << "建表成功";
      }else// 失败
      {
          // 获得错误信息封装类
          QSqlError info = sq.lastError();
          // 提取错误文本
          QString text = info.text();
          // 展示错误
          qDebug() << text;
      }


}

void Dialog::createTable2()
{
    QString sql2 = "CREATE TABLE class(name TEXT PRIMARY KEY,pwd TEXT);";

      // 创建数据库操作类对象
      QSqlQuery sq;

      if(sq.exec(sql2))
      {
          qDebug() << "建表2成功";
      }else// 失败
      {
          // 获得错误信息封装类
          QSqlError info = sq.lastError();
          // 提取错误文本
          QString text = info.text();
          // 展示错误
          qDebug() << text;
      }
}

void Dialog::selectAll(int i)
{

    QString sql = "SELECT * FROM book";
        QSqlQuery sq;
       sq.prepare(sql);
        if(sq.exec(sql))
        {
            // 清空上次显示
          //  ui->textBrowser->clear();
            while(sq.next())// 循环取出
            {
                // 取出一条数据库中的字段
                QString time = sq.value(0).toString();
                QString name = sq.value(1).toString();
                QString msg = sq.value(2).toString();
                 QString msa="历史";
                // 拼接并显示
                QString text = msa.append(":")+ time.append(":")+ name.append(":") + msg;


               QTextStream output(sockets.at(i));
                output<< text<<endl;
            }
        }


}

void Dialog::selectLOgin(QString user, QString pwd2,int i)
{
     QString name=user;
     QString pwd=pwd2;
       QString sql = "SELECT * FROM class WHERE name LIKE ? AND pwd LIKE ?;";
       QSqlQuery sq;
       sq.prepare(sql);
        if(sq.exec(sql))
        {
            while(sq.next())
            {
                qDebug() << "yes";
                QString user = sq.value(0).toString();
                QString pwd = sq.value(1).toString();
               QString text ="dlchengg";
               QTextStream output(sockets.at(i));
                output<<text;

                 }
        }
                 else
                 {

                     QSqlError info = sq.lastError();
                     // 提取错误文本
                     QString text = info.text();
                      text.prepend("登录失败:");
                     QMessageBox::warning(this,"警告",text);
        }
}

void Dialog::selectName(QString name1,int i)
{
    QString name=name1;
    QString sql = "SELECT * FROM book WHERE name LIKE ?";
        QSqlQuery sq;
       sq.prepare(sql);
        sq.addBindValue(name);
        if(sq.exec())
        {

            while(sq.next())// 循环取出
            {
                // 取出一条数据库中的字段
                QString time = sq.value(0).toString();
                QString name = sq.value(1).toString();
                QString msg = sq.value(2).toString();
                 QString msa="历史";
                // 拼接并显示
                QString text = msa.append(":")+time.append(":")+ name.append(":") + msg;


               QTextStream output(sockets.at(i));
                output<< text<<endl;
            }
        }
}

void Dialog::selectNei(QString msg, int i)
{

    QString sql = "SELECT * FROM book WHERE msg LIKE ?";
        QSqlQuery sq;
       sq.prepare(sql);
        sq.addBindValue(msg.prepend("%").append("%"));
        if(sq.exec())
        {

            while(sq.next())// 循环取出
            {
                // 取出一条数据库中的字段
                QString time = sq.value(0).toString();
                QString name = sq.value(1).toString();
                QString msg = sq.value(2).toString();
                QString msa="历史";
                // 拼接并显示
                QString text = msa.append(":")+time.append(":")+ name.append(":") + msg;


               QTextStream output(sockets.at(i));
                output<< text<<endl;
            }
        }
}



void Dialog::newConnSlot()
{
    // 获得服务器端的连接类对象
    socket = server->nextPendingConnection();
    QTextStream output(socket);
    // 如果满员则踢出
    if(sockets.size() == 20)
    {
        qDebug() << "聊天室满员";
        output << QString("聊天室已达人数上限,连接失败!");
        socket->close();
        return;
    }
    sockets.append(socket);
    // 绿蛋收到消息的信号槽
    connect(socket,SIGNAL(readyRead()),
            this,SLOT(readyReadSlot()));
    // 绿蛋掉线的信号槽
    connect(socket,SIGNAL(disconnected()),
            this,SLOT(disconnetedSlot()));
    // 给客户端打个招呼
    output << QString("服务器:你好啊!");
    // 获得对面的IP地址和端口号
    QString ip = socket->peerAddress().toString();
    quint16 port = socket->peerPort();
    QString portText = QString::number(port);

    QString text = "新连接来了!";
    text.append(ip).append(":").append(portText);
    printMsg(text);
}

void Dialog::disconnetedSlot()
{
    // 拿到发射者
    socket = (QTcpSocket*)sender();

    for(int i = 0;i<sockets.size();i++)
    {
        if(socket == sockets.at(i))
        {
            qDebug() << "第" << i << "个客户端掉线了";
            // 获得对面的IP地址和端口号
            QString ip = sockets.at(i)->peerAddress().toString();
            quint16 port = sockets.at(i)->peerPort();
            QString portText = QString::number(port);
            QString text = "连接已断开!";
            text.append(ip).append(":").append(portText);
            printMsg(text);
            sockets.removeAt(i);
        }
    }
}


//接收数据
void Dialog::readyReadSlot()
{
    for(int i=0;i<sockets.size();i++)
    {
        if(sockets.at(i)->isReadable() && sockets.at(i)->bytesAvailable()>0)
        {
            qDebug() << "第" << i << "个客户端发的消息";
            QTextStream input(sockets.at(i));
            // 一口气都读了
            QString text = input.readAll();
            //写入数据库

            QStringList list = text.split(":");
            qDebug()<<"分割后数量"<<list.size();


            if(list.size()==3)
            {

               QString time = list[0];
               QString name = list[1];
               QString msg = list[2];

              if(list[2]=="历史记录")
             {
              selectAll( i);
             }
              else if(list[2]=="按照昵称")
              {
                selectName(name,i);
              }
              else if(list[0]=="按照内容")
              {
                selectNei(msg,i);
              }
             else
             {
                createTable();
                QString sql = "INSERT INTO book VALUES(?,?,?);";
                QSqlQuery sq;
                    sq.prepare(sql);
                    sq.addBindValue(time);
                    sq.addBindValue(name);
                    sq.addBindValue(msg);

                    if(sq.exec())
                        {
                        qDebug()<<"数据插入成功";
                           // QMessageBox::information(this,"通知","数据插入成功");
                        }
                        else
                        {
                            // 获得错误信息封装类
                            QSqlError info = sq.lastError();
                            // 提取错误文本
                            QString text = info.text();
                            // 展示错误
                            text.prepend("数据插入失败:");
                            QMessageBox::warning(this,"警告",text);
                        }


                  printMsg(text);

                 for(int m=0;m<sockets.size();m++)
                 {
                    if(m==i)
                        continue;
                    QTextStream output(sockets.at(m));
                    output << text;
                 }
                }
               }


            else if(list.size()==2)
            {
                createTable2();
               QString name = list[0];
               QString pwd = list[1];
                QString sql = "INSERT INTO class VALUES(?,?);";
                QSqlQuery sq;
                    sq.prepare(sql);
                    sq.addBindValue(name);
                    sq.addBindValue(pwd);
                    if(sq.exec())
                        {
                        qDebug()<<"注册成功";
                           // QMessageBox::information(this,"通知","数据插入成功");
                        }
                        else
                        {
                            // 获得错误信息封装类
                            QSqlError info = sq.lastError();
                            // 提取错误文本
                            QString text = info.text();
                            // 展示错误
                            text.prepend("注册失败:");
                            QMessageBox::warning(this,"警告",text);
                        }


                printMsg(text);

                for(int m=0;m<sockets.size();m++)
                {
                    if(m==i)
                        continue;
                    QTextStream output(sockets.at(m));
                    output << text;
                }
              }
            else if(list.size()==4)
            {

                QString name = list[0];
                QString pwd = list[1];
                qDebug() << name<<pwd;


                 QString sql = "SELECT * FROM class WHERE name=? AND pwd=?";
                  QSqlQuery sq;
                  sq.prepare(sql);
                  sq.addBindValue(name);
                  sq.addBindValue(pwd);
                   qDebug() << "yes";
                   if(sq.exec())
                   {

                           // 取出一条数据库中的字段
                     while(sq.next())
                {
                           QString name = sq.value(0).toString();
                           QString pwd = sq.value(1).toString();

                           qDebug() <<name<<pwd;


                           qDebug() << "yes";
                          QString text ="dlchengg";
                          QTextStream output(sockets.at(i));
                           output<<text;
                 }


                    }
                    else
                    {

                                QSqlError info = sq.lastError();
                                // 提取错误文本
                                QString text = info.text();
                                 text.prepend("登录失败:");
                                QMessageBox::warning(this,"警告",text);
                     }
                  }



            }
        }



}

四、项目结果

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

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

相关文章

测试用例:确保软件质量的基石

大家好&#xff0c;我是一名测试开发工程师&#xff0c;已经开源一套【自动化测试框架】和【测试管理平台】&#xff0c;欢迎大家联系我&#xff0c;一起【分享测试知识&#xff0c;交流测试技术】 在当今这个数字化时代&#xff0c;软件已经成为人们日常生活、工作和学习中不可…

Hive3:Centos7环境部署Hive服务

一、安装说明 1、Hadoop集群情况 3台机器&#xff1a;4G2C、2G2C、2G2C 安装教程&#xff1a;Centos7环境安装Hadoop集群 2、安装MySQL&#xff0c;用于存储Hive的元数据 在102机器上安装MySQL 安装MySQL使用服务器的root账号 3、最后安装Hive 安装hive过程使用服务器的atgu…

fatal: Could not read from remote repository. 解决方法

问题描述&#xff1a; Git : fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists。 解决方法&#xff1a; 当在网上尝试大量方法仍然失败的时候&#xff0c;不妨试试这个方法。 在 github 上&…

ROUND() Function in SQL(四舍五入)

ROUND() Function in SQL ROUND() 函数用于将数值四舍五入到指定的小数位数或者整数位数。 不同的数据库系统可能会有一些细微的语法差异&#xff0c;但基本功能都是一致的。 1. 基本语法 ROUND(number, decimal_places)number: 要进行四舍五入的数值。decimal_places: 可选参…

2024年7月30日 十二生肖 今日运势

小运播报&#xff1a;2024年7月30日&#xff0c;星期二&#xff0c;农历六月廿五 &#xff08;甲辰年辛未月乙未日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;兔、马、猴 需要注意&#xff1a;狗、鼠、牛 喜神方位&#xff1a;西北方 财神方位&#xff1a;…

基于SpringBoot+Vue的游戏攻略分享平台(带1w+文档)

基于SpringBootVue的游戏攻略分享平台(带1w文档) 本系统为了数据库结构的灵活性所以打算采用MySQL来设计数据库&#xff0c;而java技术&#xff0c;B/S架构则保证了较高的平台适应性。本文主要介绍了本系统的开发背景&#xff0c;所要完成的功能和开发的过程&#xff0c;主要说…

大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

零基础入门转录组数据分析——加权基因共表达网络分析(WGCNA,Weighted correlation network analysis)

零基础入门转录组数据分析——加权基因共表达网络分析&#xff08;WGCNA&#xff0c;Weighted correlation network analysis&#xff09; 目录 零基础入门转录组数据分析——加权基因共表达网络分析&#xff08;WGCNA&#xff0c;Weighted correlation network analysis&#…

c语言代码运行不成功,如何解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

GEE数据:Sentinel-2数据更新新增两个云和雪波段(MSK_CLDPRB和MSK_SNWPRB)

目录 简介 数据时间 数据提供者 Collection Snippet 波段名称 Class Table: SCL 影像属性 代码 结果 简介 2022年1月25日之后&#xff0c;PROCESSING_BASELINE为“04.00”或以上的Sentinel-2场景的DN&#xff08;值&#xff09;范围移动了1000。HARMONIZED集合将新场…

【C++】std::shared_ptr智能指针详解和示例

在C中&#xff0c;智能指针是一种用于自动管理动态分配内存的机制&#xff0c;旨在减少内存泄漏和野指针的风险。std::shared_ptr 是C标准库提供的几种智能指针之一&#xff0c;它通过共享所有权的机制来管理动态分配的对象。本文将详细解析 std::shared_ptr 的工作原理、特性&…

【电路笔记】-共源JFET放大器

共源JFET放大器 文章目录 共源JFET放大器1、概述2、共源JFET放大器3、JFET放大器电流和功率增益共源JFET放大器使用结场效应晶体管作为其主要有源器件,提供高输入阻抗特性。 1、概述 普通源JFET放大器与共射极BJT放大器相比有一个重要优点,即FET具有极高的输入阻抗,再加上低…

工业三防平板,高效能与轻便性的结合

在当今数字化、智能化的工业时代&#xff0c;工业三防平板作为一种创新的设备&#xff0c;正以其独特的优势在各个领域发挥着重要作用。它不仅具备高效能的处理能力&#xff0c;还拥有出色的轻便性&#xff0c;为工业生产和管理带来了前所未有的便利。 一、高效能的核心动力 工…

2024年中职云计算实验室建设及云计算实训平台整体解决方案

随着信息技术的飞速发展&#xff0c;云计算作为新一代信息技术的核心&#xff0c;正逐步渗透到各行各业&#xff0c;成为推动数字化转型的重要力量。为了适应这一趋势&#xff0c;中职教育作为技能型人才培养的重要阵地&#xff0c;亟需加强云计算实验室建设与云计算实训平台的…

web,apache,nginx

web基本概念和常识 Web:为用户提供的一种在互联网上浏览信息的服务&#xff0c;Web 服务 是动态的、可交 互的、跨平台的和图形化的。 Web 服务为用户提供各种互联网服务&#xff0c;这些服务包括信息浏览服务&#xff0c;以及各种交互式服务&#xff0c;包括聊天、购物、学习…

泰迪智能科技大数据实验室——陕西省高校合作成功案例

近年来&#xff0c;陕西省紧跟国家大数据发展战略&#xff0c;积极推进大数据产业发展。在政策扶持、产业布局、技术创新等方面取得显著成效。泰迪智能科技大数据实验室立足陕西&#xff0c;携手西安邮电大学、西安财经大学、陕西科技大学镐京学院、宝鸡文理学院、渭南师范学院…

编译期链接时共享库搜索路径优先级实验

编译期链接时共享库搜索路径优先级实验 前言实验环境目录说明准备工作单独测试不配置路径默认路径LIBRARY_PATH-L 优先级测试默认路径和LIBRARY_PATH-L和默认路径 DEBUG模式编译器配置详细信息链接器详细信息DEBUG总结验证 默认路径>LIBRARY_PATH原因附录库文件源码主程序源…

bugku-web-ctf-变量1

<?php error_reporting(0); include "flag1.php"; highlight_file(__file__); if(isset($_GET[args])){$args $_GET[args];if(!preg_match("/^\w$/",$args)){die("args error!");}eval("var_dump($$args);"); } ?> error_r…

Apache、nginx

一、Web 1、概述 Web&#xff1a;为⽤户提供的⼀种在互联⽹上浏览信息的服务&#xff0c;Web 服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为⽤户提供各种互联⽹服务&#xff0c;这些服务包括信息浏览服务&#xff0c;以及各种交互式服务&#xff0c;包括聊天、购物…

React基础知识 精简全面 推荐

这篇博文主要对一些刚入门react框架的同学&#xff0c;以及对react基本知识进行巩固的&#xff0c;最后就是精简一下基本知识&#xff0c;以方便自己查看&#xff0c;感谢参考&#xff0c;有问题评论区交流&#xff0c;谢谢。 目录 1.JSX 2.Props 和 State 3.组件生命周期…