qt简易网络聊天室 数据库的练习

qt网络聊天室

服务器:

配置文件.pro

QT       += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

头文件

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>   //服务器类头文件
#include <QDebug>   //信息调试类
#include <QMessageBox>  //消息对话框类头文件
#include <QTcpSocket>  //套接字类头文件QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_startBtn_clicked();void newConnection_slot();   //自定义处理newConnection信号的函数void readyRead_slot();   //自定义处理readyRead信号的槽函数private:Ui::Widget *ui;//定义一个服务器指针QTcpServer *server;//定义一个客户端容器QList<QTcpSocket *> clientList;
};
#endif // WIDGET_H

源文件

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

//服务器
//1、实例化服务器类对象,该对象就是服务器
//2、服务器调用成员函数listen()将服务器设置为被动监听状态,监听时可以指定主机地址,也可以any监听所有的主机地址。 端口号若为0,则服务器自动分配,也可指定端口号
//3、若有客户端连接,则服务器会发送一个newconnection信号,连接到对应的槽函数中处理相关逻辑
//4、在处理connect信号的槽函数中,使用nextPendingConntiin获取最新连接的客户端套接字
//5、将获取的套接字存入客户端容器中
//6、若客户端有数据项向服务器发送,则客户端套接字会自动发射一个readyRead信号,来凝结到对应的槽函数中处理相关逻辑
//7、在处理readyRead信号的槽函数中,来读取数据,
//7-1、先循环遍历哪些套接字是无效的(断开连接的客户端),将其从客户端容器中删除,使用state函数判断状态,为0则是断开连接的,不为0不是断开的
//7-2、在循环遍历判断是哪个客户端发来的数据,使用BytesAviable来判断哪个客户端有数据,为0则代表无
//7-3、若有数据,使用read readLine readAll函数读取数据,
//11、向套接字中写数据,可以使用write函数#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_startBtn_clicked()
{if(ui->portEdit->text().isEmpty()){QMessageBox::critical(this, "失败", "端口号不可为空");return;}//调用成员函数listen()将服务器设置为被动监听状态//函数原型:bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);//参数1:主机号,any监听所有的主机地址, 指定主机地址,监听指定的主机地址。//参数2:通过哪个端口号访问服务器,若为0,则服务器自由分配,若不为0,则指定要监听的端口号, quint16 是无符号的16位整型, short//返回值,成功返回真,失败返回假//获取端口号quint16 port = ui->portEdit->text().toUInt();  //toUInt(), 转为无符号整型if(!server->listen(QHostAddress::Any, port)){QMessageBox::critical(this, "失败", "服务器启动失败");return;}else{QMessageBox::information(this, "成功", "服务器启动成功");}//此时说明服务器启动成功,并对客户端进行监听//若有客户端发送连接请求,则服务器会自动发射一个newconnection信号//将给信号连接到对应的槽函数中connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);
}//处理newConnection函数的槽函数的实现
void Widget::newConnection_slot()
{//循环遍历,从客户端套接字容器中删去已断开连接的客户端套接字//函数原型:SocketState state() const;//功能:判断套接字的状态//参数,无//返回值:返回套接字的状态(枚举, 0代表断开连接)for(int i = 0; i<clientList.count(); i++){if(0 == clientList.at(i)->state()){//移除下标为i的无效的客户端clientList.removeAt(i);}}//获取新连接的客户端的套接字//函数原型:virtual QTcpSocket *nextPendingConnection();//功能:获取新连接的客户端的套接字//无参,返回值就是获取到的客户端的套接字的指针QTcpSocket *s = server->nextPendingConnection();//将获取到的套接字存入到客户端套接字容器中clientList.push_back(s);//此时客户端和服务器建立连接//如果套接字有数据项发送给服务器时,该套接字自动发射一个readyRead信号//将readyRead信号连接到对应的槽函数中处理相关逻辑connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);}//自定义处理readyRead信号的槽函数的实现
void Widget::readyRead_slot()
{//遍历判断是哪个客户端套发来的数据//使用BytesAvalible函数,若无数据可读则为0for(int i=0; i<clientList.count(); i++){if(clientList[i]->bytesAvailable() != 0){//读取套接字中的数据,可用read/readall/readline//函数原型QByteArray readAll();//功能:读取数据//无参,返回值,c风格的字符串QByteArray msg = clientList[i]->readAll();//将数据展示到ui界面上ui->msgList->addItem(QString::fromLocal8Bit(msg));  //将C风格的字符串转为QString类型的//将接收到的消息发送给所有的客户端for(int j=0; j<clientList.count(); j++){clientList[j]->write(msg);}}}}

ui界面

客户端

配置文件.pro

QT       += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>     //客户端头文件
#include <QDebug>        //信息调试类头文件
#include <QMessageBox>  //消息对话框类头文件QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_connectBtn_clicked();void connected_slot();  //自定义处理connected信号的槽函数void readyRead_slot();  //自定义处理readyRead信号的槽函数void on_sendBtn_clicked();void on_disConnectBtn_clicked();void disconnected_slot();  //自定义处理disconnected信号的槽函数private:Ui::Widget *ui;//定义一个客户端指针QTcpSocket *client;
};
#endif // WIDGET_H

源文件

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

//客户端
//1、实例化QTcpSocket类对象,该对象就是客户端
//2、调用客户端对象的connecTtoHost的成员函数向服务器发送连接请求,需要给定服务器的ip和端口
//3、如果与服务器连接成功,客户端自动发射一个connected信号,将信号与对应的槽函数进行连接处理相关逻辑即可
//4、如果服务器有数据项向客户端发送,客户端会自动发射一个readyRead信号,将信号连接到对应的槽函数读取数据
//5、若客户端要给服务器发送消息,使用write函数
//6、在处理readyRead信号的槽函数中,使用read/readLine/readAll函数读取数据
//7、使用该客户端对象的disconnectFromHost函数端口与服务器的连接,
//8、如果成功断开则会自动发射disconnected信号,将disconnected信号与对应的槽函数连接处理即可#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//实例化客户端空间client  = new QTcpSocket(this);   //该对象就是客户端,创建客户端成功ui->sendBtn->setEnabled(false);ui->disConnectBtn->setEnabled(false);//若连接成功,则客户端自动发射一个connected信号//将connected信号连接到对应的槽函数处理相关逻辑//因为只需要连接一次,所以将其写到构造函数中connect(client, &QTcpSocket::connected, this, &Widget::connected_slot);//若服务器有数据项向客户端发送,客户端会自动发送readyRead信号//将readyRead信号与对应的槽函数连接//由于只需连接一次,所以写在构造函数中connect(client, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);//若断开成功,则客户端会自动发射一个disconnected信号//连接到对应的槽函数处理即可//因只需要连接一次,写在构造函数即可connect(client, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);
}Widget::~Widget()
{delete ui;
}//连接服务器按钮的槽函数
void Widget::on_connectBtn_clicked()
{if(ui->userNameEdit->text().isEmpty() || ui->ipEdit->text().isEmpty() || ui->portEdit->text().isEmpty()){QMessageBox::critical(this, "Error", "信息填写不完整");return;}//获取服务器的主机地址QString ip = ui->ipEdit->text();//获取服务器的端口号quint16 port = ui->portEdit->text().toUInt();  //toUInt()转化为无符号整数//该客户端对象调用成员函数连接服务器//函数原型:virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);//功能:客户端连接服务器//参数1:服务器的ip地址//参数2:客户端的端口号 , quint16 无符号的16位的整型 short//返回值:无client->connectToHost(ip, port);//顺便向客户端发送一条数据QString msg = ui->userNameEdit->text();msg = msg+ ": 进入聊天室";//使用write函数向服务器发送数据client->write(msg.toLocal8Bit());  // toLocal8Bit()转为C风格字符串//若连接成功,则客户端自动发射一个connected信号//将connected信号连接到对应的槽函数处理相关逻辑//因为只需要连接一次,所以将其写到构造函数中
}//处理connected信号的槽函数的实现
void Widget::connected_slot()
{//说明连接成功ui->userNameEdit->setEnabled(false);ui->ipEdit->setEnabled(false);ui->portEdit->setEnabled(false);ui->connectBtn->setEnabled(false);ui->disConnectBtn->setEnabled(true);ui->sendBtn->setEnabled(true);//若服务器有数据项向客户端发送,客户端会自动发送readyRead信号//将readyRead信号与对应的槽函数连接//由于只需连接一次,所以写在构造函数中}//处理readyRead信号的槽函数
void Widget::readyRead_slot()
{//使用read/readLine/readAll读取数据QByteArray msg =client->readAll();//将读取的数据展示到ui界面上ui->msgList->addItem(QString::fromLocal8Bit(msg));}//发送按钮的槽函数
void Widget::on_sendBtn_clicked()
{//获取用户名QString userName = ui->userNameEdit->text();//获取文本输入框的内容QString msg = ui->textEdit->toPlainText();msg = userName + ": " + msg;//将数据发送给服务器client->write(msg.toLocal8Bit());//清空文本输入框ui->textEdit->clear();}//断开按钮对应的槽函数
void Widget::on_disConnectBtn_clicked()
{//告知服务器即将断开连接QString userName = ui->userNameEdit->text();QString msg = userName + ": 退出聊天室";client->write(msg.toLocal8Bit());//使用该类对象调用disconnectFromHost断开与服务器的连接//函数原型:virtual void disconnectFromHost();//无参 无返client->disconnectFromHost();//若断开成功,则客户端会自动发射一个disconnected信号//连接到对应的槽函数处理即可//因只需要连接一次,写在构造函数即可
}void Widget::disconnected_slot()
{ui->sendBtn->setEnabled(false);ui->disConnectBtn->setEnabled(false);ui->userNameEdit->setEnabled(true);ui->ipEdit->setEnabled(true);ui->portEdit->setEnabled(true);QMessageBox::information(this, "退出", "断开成功");
}

ui界面

数据库:
配置文件.pro

QT       += core gui sqlgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSqlDatabase>    //数据库管理类
#include <QSqlQuery>       //执行sql语句对应的类
#include <QSqlRecord>      //记录类
#include <QMessageBox>     //消息对话框类
#include <QDebug>          //信息调试类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_inputBtn_clicked();void on_showBtn_clicked();void on_searchBtn_clicked();void on_deleteBtn_clicked();private:Ui::Widget *ui;//定义一个数据库对象QSqlDatabase db;
};
#endif // WIDGET_H

源文件:

main.cpp

#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//判断数据库对象是否包含了自己使用的数据库,Student.dbif(!db.contains("Student.db")){//添加数据库// static QSqlDatabase addDatabase(QSqlDriver* driver, const QString& connectionName = QLatin1String(defaultConnection));//参数1:数据库的版本//返回值:添加的数据库db = QSqlDatabase::addDatabase("QSQLITE");   //表明使用的是Sqlite3版本的数据库//给数据库命名db.setDatabaseName("Student.db");}//打开数据库if(!db.open()){QMessageBox::information(this, "提示", "数据库打开失败");}//此时说明数据库已经创建出来并打开了,就可以创建数据表了//创建数据表需要使用sql语句, 需要使用QSQLQuerry对象来完成//准备sql语句
//    QString sql = "create table if not exists myTable("
//            "id integer Primary key autoincrement,"
//            "numb integer,"
//            "name varchar(10),"
//            "sex varchar(4))";QString sql = "create table if not exists myTable("              //创建表的sql语句"id integer primary key autoincrement,"          //id主键,允许自增"numb integer,"                                   //学号,是整形"name varchar(10),"                               //姓名   字符串"score integer,""sex varchar(4))";                                 //性别 字符串//定义语句执行者QSqlQuery queery;//使用querry调用成员函数exec执行sql语句if(!queery.exec(sql)){QMessageBox::information(this, "失败", "表格创建失败");return;}else{QMessageBox::information(this, "成功", "表格创建出成功");}
}Widget::~Widget()
{delete ui;
}//录入按钮对应的槽函数
void Widget::on_inputBtn_clicked()
{//获取ui界面中要存入数据库中的数据int numb_ui = ui->numEdit->text().toUInt();   //获取ui界面的学号QString name_ui = ui->nameEdit_2->text();  //获取ui界面的姓名int score_ui = ui->scoreEdit_3->text().toUInt();  //获取ui界面上的成绩QString sex_ui = ui->sexEdit_4->text();  //获取ui界面上的性别//判断是否有漏填数据if(numb_ui == 0 || name_ui.isEmpty() || score_ui == 0 || sex_ui.isEmpty()){QMessageBox::information(this, "提示", "请将数据填写完整");return;}//准备sql语句QString sql = QString("insert into myTable(numb, name, score, sex)""values(%1, '%2', %3, '%4')").arg(numb_ui).arg(name_ui).arg(score_ui).arg(sex_ui);qDebug() << sql;//定义语句执行者QSqlQuery querry;//调用执行者的exec()函数执行sql语句if(!querry.exec(sql)){QMessageBox::information(this, "失败", "数据插入失败");}else{QMessageBox::information(this, "成功", "数据录入成功");}}//展示按钮对应的槽函数
void Widget::on_showBtn_clicked()
{QString sql = "select * from MyTable";//定义语句执行者QSqlQuery querry;//调用执行者的exec()函数执行sql语句if(!querry.exec(sql)){QMessageBox::information(this, "失败", "查询失败");return;}else{QMessageBox::information(this, "成功", "查询成功");}//此时,将查找到的所有结果。全部都放在querry中了//可以通过next函数不断遍历查询结果int i = 0;   //记录行号while(querry.next()){//遍历的就是任意一组记录querry.record//qDebug() << querry.record();//querry.record().count();  返回当前记录对应数据项的个数//querry.record().count();//要找到每条记录中的每个数据//qDebug() << querry.record().value(2);//querry.record().value(j).toString() //将记录的某一项的转为字符串//将数据库中的表格展示到ui界面for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i, j, new QTableWidgetItem(querry.record().value(j+1).toString()));}i++;   //进行下一行}
}void Widget::on_searchBtn_clicked()
{//获取学号QString name_ui = ui->nameEdit_2->text();int numb_ui = ui->numEdit->text().toUInt();//sql语句QString sql = QString("select * from myTable where numb = %1").arg(numb_ui);//定义语句执行者QSqlQuery querry;//执行者使用exec函数执行sql语句if(!querry.exec(sql)){QMessageBox::information(this , "提示", "查询失败");return;}else{QMessageBox::information(this , "提示", "查询成功");}int i = 0;  //行号while(querry.next()){for(int j=0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i, j, new QTableWidgetItem(querry.record().value(j+1).toString()));}}
}void Widget::on_deleteBtn_clicked()
{QString name_ui = ui->nameEdit_2->text();//sql语句QString sql = QString("delete from myTable where name = '%1'").arg(name_ui);qDebug() << sql;//定义语句执行者QSqlQuery querry;//querry调用自己成员函数执行sql语句if(!querry.exec(sql)){QMessageBox::information(this, "提示", "删除失败");return;}else{QMessageBox::information(this, "提示", "删除成功");}}

ui界面

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka3.0.0版本——文件清理策略

目录 一、文件清理策略1.1、文件清理策略的概述1.2、文件清理策略的官方文档1.3、日志超过了设置的时间如何处理1.3.1、delete日志删除&#xff08;将过期数据删除&#xff09;1.3.2、compact日志压缩 一、文件清理策略 1.1、文件清理策略的概述 Kafka 中默认的日志保存时间为…

Cento7 Docker-compose安装以及使用InfluxDB

InfluxDB是一个时序数据库&#xff0c;主要用于监控场景的数据支撑&#xff0c;对于那些写少读多按时间序查询数据的场景是非常适用的。接下来我们用docker-compose的形式安装。首先先装好docker,docker-compose命令 yum -y install yum-utils device-mapper-persistent-data…

【买华为云产品,返CSDN余额红包】,快来薅羊毛!

华为云828营销季火热进行中&#xff0c;9月15日前首次购买华为云产品官网任意一款产品&#xff0c;可获得相应比例的CSDN红包。 热门产品云服务器、域名、商标、主机安全等产品都在其中&#xff0c;任君挑选。 活动优惠价购买后还是获得相应比例余额红包&#xff0c;实际付费金…

游戏软件报错d3dx9_43.dll丢失怎么解决?这5个解决方法可以修复

我想和大家分享一个关于电脑问题的话题——d3dx9_43.dll丢失怎么解决。这个话题对于很多使用电脑的朋友来说&#xff0c;可能是一个非常棘手的问题。d3dx9_43.dll是 DirectX中非常重要的一部分&#xff0c;许多游戏和应用程序都需要它来正常运行。如果丢失了这个文件&#xff0…

Simulink建模与仿真(3)-Simulink 简介

分享一个系列&#xff0c;关于Simulink建模与仿真&#xff0c;尽量整理成体系 1、Simulink特点 Simulink是一个用来对动态系统进行建模、仿真和分析的软件包。使用Simulink来建模、分析和仿真各种动态系统(包括连续系统、离散系统和混合系统)&#xff0c;将是一件非常轻松的事…

万物互联:软件与硬件的协同之道

在当今数字化时代&#xff0c;我们身边的一切似乎都与计算机和互联网有关。从智能手机到智能家居设备&#xff0c;从自动驾驶汽车到工业生产线&#xff0c;无论我们走到哪里&#xff0c;都能看到软件和硬件的协同作用。本文将探讨这种协同作用&#xff0c;解释软件和硬件如何相…

ThreadLocal

ThreadLocal 参考&#xff1a;https://blog.csdn.net/u010445301/article/details/111322569 ThreadLocal简介 作用&#xff1a;实现线程范围内的局部变量&#xff0c;即ThreadLocal在一个线程中是共享的&#xff0c;在不同线程之间是隔离的。 原理&#xff1a;ThreadLocal存…

c高级day1(9.6) 离线软件安装,文件相关指令,文件权限相关指令,

作业: 使用cut截取出Ubuntu用户的家目录&#xff0c;要求&#xff1a;不能使用":"作为分割 不会 Xmind&#xff1a;

vue2踩坑之项目:生成二维码使用vue-print-nb打印二维码

1. vue2安装 npm install vue-print-nb --save vue3安装 npm install vue3-print-nb --save 2. //vue2 引入方式 全局 main.js import Print from vue-print-nb Vue.use(Print) ------------------------------------------------------------------------------------ //vue2 …

WEBGL(4):动态绘制点并根据详细自定义颜色

1 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, …

前端面试中Vue的有经典面试题三

11. 网页从输入网址到渲染完成经历了哪些过程&#xff1f; 大致可以分为如下7步&#xff1a; 输入网址&#xff1b; 发送到DNS服务器&#xff0c;并获取域名对应的web服务器对应的ip地址&#xff1b; 与web服务器建立TCP连接&#xff1b; 浏览器向web服务器发送http请求&a…

windows 不能ping通虚拟机问题

先查看windows网卡 查看虚拟机种 对应VMnet8种的 nat &#xff08;我用的是这种连接方式&#xff09;设置 问题是不在同一个网段&#xff0c;修改windows VMnet8网卡的配置 保证网关、网段是一样的 现在ping问题解决&#xff0c;也能windows远程连接虚拟机

Bridge Champ举办人机对战赛:NFT游戏与传统竞技共生发展编织新格局

概要 现在,NFT与体育竞技正日益紧密地联系在一起。一些体育项目开始推出与赛事或球队相关的NFT,同时也有部分NFT游戏开始举办电子竞技赛事。这种共生发展正在改变体育竞技的生态。 笔者采访了桥牌冠军项目相关负责人,探讨NFT游戏与传统体育竞技的融合潜力。桥牌冠军近期成功举…

(二十一)大数据实战——Flume数据采集之复制和多路复用案例实战

前言 本节内容我们完成Flume数据采集的一个多路复用案例&#xff0c;使用三台服务器&#xff0c;一台服务器负责采集本地日志数据&#xff0c;通过使用Replicating ChannelSelector选择器&#xff0c;将采集到的数据分发到另外俩台服务器&#xff0c;一台服务器将数据存储到hd…

pytorch-神经网络-手写数字分类任务

Mnist分类任务&#xff1a; 网络基本构建与训练方法&#xff0c;常用函数解析 torch.nn.functional模块 nn.Module模块 读取Mnist数据集 会自动进行下载 %matplotlib inlinefrom pathlib import Path import requestsDATA_PATH Path("data") PATH DATA_PATH / &…

使用 Nacos 在 Spring Boot 项目中实现服务注册与配置管理

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

每日刷题(回溯法经典问题之子集)

食用指南&#xff1a;本文为作者刷题中认为有必要记录的题目 前置知识&#xff1a;回溯法经典问题之组合 ♈️今日夜电波&#xff1a;想着你—郭顶 1:09 ━━━━━━️&#x1f49f;──────── 4:15 …

jmeter setUp Thread Group

SetUp Thread Group 是一种特殊类型的线程组&#xff0c;它用于在主测试计划执行之前执行一些初始化任务。 SetUp Thread Group 通常用于以下几种情况&#xff1a; 用户登录&#xff1a;在模拟用户执行实际测试之前&#xff0c;模拟用户登录到系统以获取访问权限。 创建会话&a…

freertos之资源管理

中断屏蔽 屏蔽中断函数 在任务中使用 taskENTER_CRITICA()/taskEXIT_CRITICAL() 在中断中使用 taskENTER_CRITICAL_FROM_ISR()/taskEXIT_CRITICAL_FROM_ISR() 功能介绍 使用上述函数&#xff0c;进入临界中断&#xff0c;任务不会切换&#xff0c;且中断优先级处于con…

Ubuntu入门04——目录与文件

目录 1.显示当前工作目录 2.更改目录 3.创建工作目录 4.删除工作目录 5.移动文件或者文件夹 6.文件夹and文件查看命令 7. 回到根目录&#xff0c;回到上一级 8.删除工作目录 9.查看目录和文件 10.以树状图列出目录内容 11.文件查找 12.在数据库中查找文件或目录 1…