Qt C++ TCP服务端响应多客户端通讯

本示例使用的设备:WIFI无线4G网络RFID云读卡器远程网络开关物流网阅读器TTS语音-淘宝网 (taobao.com)

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QMessageBox"
#include <QDebug>
#include <exception>
#include <QTcpServer>
#include <QTcpSocket>
#include <QObject>
#include <QTime>
#include <QTreeWidgetItem>
#include <QClipboard>bool listening=false;
QTcpServer m_server;
QTcpSocket m_socket;//获取本机所有网卡IP------------------------------------------------------------------------------------------------------
QStringList getAllIPAddresses() {QStringList ips;QList<QHostAddress> list = QNetworkInterface::allAddresses();for (int i = 0; i < list.size(); ++i) {QHostAddress address = list.at(i);// 检查是否为IPv4地址,并排除回环地址if (address.protocol() == QAbstractSocket::IPv4Protocol && address != QHostAddress::LocalHost) {ips << address.toString();}}return ips;
}//获取系统现时间-------------------------------------------------------------------------------------------------------------
QString getsystime(){QTime time = QTime::currentTime();QString timeStr = time.toString("hh:mm:ss.zzz");return timeStr;
}//获取系统日期时间-------------------------------------------------------------------------------------------------------------
QString getsysdatetime(){QDateTime currentDateTime = QDateTime::currentDateTime();QString dateTimeString = currentDateTime.toString("yy-MM-dd hh:mm:ss");return dateTimeString;
}//QByteArray转16进制QString------------------------------------------------------------------------------------------------
QString ByteArrayToHexString(QByteArray data){QString ret(data.toHex().toUpper());int len = ret.length()/2;for(int i=1;i<len;i++){ret.insert(2*i+i-1," ");}return ret;
}//通讯报文显示-----------------------------------------------------------------------------------------------------
void MainWindow::listadditems(int ctr,QString listinfo){switch (ctr){case 0:if(ui->listWidget_report->count()>30){ui->listWidget_report->clear();}ui->listWidget_report->addItem(listinfo);ui->listWidget_report->setCurrentRow(ui->listWidget_report->count()-1);break;case 1:ui->listWidget_online->addItem(listinfo);ui->listWidget_online->setCurrentRow(ui->listWidget_online->count()-1);}
}MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);ui->TEPort->setPlainText("39169");        //出厂默认39169端口ui->spinBox_dispdelay->setValue(20);ui->spinBox_swit->setValue(30);ui->spinBox_voice->setValue(8);ui->textEdit_disp->setText("欢迎您使用我们的网络读卡器!");ui->textEdit_tts->setText("感谢您的使用,您的支持是我们最大的动力!");QStringList ips = getAllIPAddresses();foreach (QString ip, ips) {ui->CBIP->addItem(ip);}if(ui->CBIP->count()<1){QMessageBox::information(NULL, "提示", "未搜索到本机的网卡,系统不能正常运行!");delete ui;}
}MainWindow::~MainWindow()
{delete ui;
}//启动、关闭TCP服务-------------------------------------------------------------------------------------------------------
void MainWindow::initserver(){try{if(ui->pushButton_initserver->text()=="开启TCP服务"){QString ipstr=ui->CBIP->currentText();QHostAddress localeip(ipstr);quint16 port=ui->TEPort->toPlainText().toUInt();m_server = new QTcpServer(this);m_server->listen(localeip, port);connect(m_server, &QTcpServer::newConnection, this, &MainWindow::onNewConnection);listening=true;ui->pushButton_initserver->setText("停止");listadditems(0,getsystime()+" Tcp Server is listening...");}else{listening=false;m_server->close();ui->pushButton_initserver->setText("开启TCP服务");for(int i=0;i<tcpclientlist.count();i++){tcpclientlist.at(i)->close();//tcpclientlist.remove(i);ui->listWidget_online->takeItem(i);}tcpclientlist.clear();listadditems(0,getsystime()+" Tcp Server is close! ");}}catch(_exception){listening=false;ui->pushButton_initserver->setText("开启TCP服务");}
}//侦听到有新的TCP客户端接入服务--------------------------------------------------------------------------------------------
void MainWindow::onNewConnection()
{m_socket = m_server->nextPendingConnection();tcpclientlist.append(m_socket);QString RemoIp=m_socket->peerAddress().toString();QString RemoPort=QString::number( m_socket->peerPort());listadditems(1,RemoIp+":"+RemoPort);listadditems(0,getsystime()+" NewConn "+RemoIp+":"+RemoPort);connect(m_socket, &QTcpSocket::readyRead, this, &MainWindow::onReadyRead);connect(m_socket, &QTcpSocket::disconnected, this, &MainWindow::onClientDisconnected);connect(m_socket, &QTcpSocket::connected, this, &MainWindow::onConnected);
//  connect(m_socket, &QTcpSocket::stateChanged, this, &MainWindow::onStateChanged);}//接收到TCP客户端传送来来的数据-------------------------------------------------------------------------------------------
void MainWindow::onReadyRead()
{QByteArray buffer;for(int row=0;row<tcpclientlist.count();row++){m_socket=tcpclientlist.at(row);buffer = m_socket->readAll();if(buffer.length()!=0){QString RemoIp=m_socket->peerAddress().toString();QString RemoPort=QString::number( m_socket->peerPort());listadditems(0,getsystime()+" Receive: "+RemoIp+":"+RemoPort+"    "+ByteArrayToHexString(buffer));unsigned char databuff[buffer.length()];std::copy(buffer.begin(), buffer.end(), databuff);switch (databuff[0]){case 0xc1:case 0xcf:Analyze_c1_cf(row,databuff,buffer.length());          //解析读取IC卡卡号break;case 0xd1:case 0xdf:Analyze_d1_df(row,databuff,buffer.length());          //解析读取ID卡卡号break;default:break;}}}
}//侦测到TCP客户端断开连接---------------------------------------------------------------------------------------------
void MainWindow::onClientDisconnected()
{QString RemoIp=m_socket->peerAddress().toString();quint16 RemoPort= m_socket->peerPort();for(int i=0;i<tcpclientlist.count();i++){if(tcpclientlist.at(i)->peerAddress().toString()==RemoIp && tcpclientlist.at(i)->peerPort()==RemoPort){tcpclientlist.remove(i);ui->listWidget_online->takeItem(i);listadditems(0,getsystime()+" Disconn: "+RemoIp+":"+QString::number(RemoPort));}}
}void MainWindow::onConnected()
{QString RemoIp=m_socket->peerAddress().toString();QString RemoPort=QString::number( m_socket->peerPort());
}//void MainWindow::onStateChanged(QAbstractsocket::SocketState socketstate){
//    switch (socketstate){
//    case QAbstractSocket::UnconnectedState:ui->labConnectState->setText("Unconnectedstate");break;
//    case QAbstractSocket::HostLookupState:ui->labConnectState->setText("HostLookupstate");break;
//    case QAbstractSocket::ConnectedState:ui->labConnectState->setText("connectedstate");break;
//    case QAbstractSocket::ConnectingState:ui->labConnectState->setText("connectingstate");break;
//    case QAbstractSocket::BoundState: ui->labConnectState->setText("Boundstate");break;
//    case QAbstractSocket::ClosingState:ui->labConnectState->setText("closingstate");break;
//    case QAbstractSocket::ListeningState:ui->labConnectState->setText("listeningstate");break;
//    }
//}//解析读取IC卡卡号-------------------------------------------------------------------------------------------------------------------
void MainWindow::Analyze_c1_cf(int socketid,unsigned char databuff[], qint64 buflen)
{QString IPAddress=QString::asprintf("%d", databuff[1])+"."+QString::asprintf("%d", databuff[2])+"."+QString::asprintf("%d", databuff[3])+"."+QString::asprintf("%d", databuff[4]); //设备IP地址,广域网上使用,一般不对此IP回应,而是对数据流的 ip及端口 回应QString DeviceNumber=QString::asprintf("%05d",databuff[5]+databuff[6]*256);   //设备自编机号QString FrameNumber=QString::asprintf("%05d",databuff[7]+databuff[8]*256);    //数据包号int cardnolen=databuff[9];QString CardnoHexZ="";          //16进制卡号正码QString CardnoHexF="";          //16进制卡号反码for (int i=0;i<cardnolen;i++){CardnoHexZ=CardnoHexZ+QString::asprintf("%02X", databuff[10+i]);if(i<4){CardnoHexF=CardnoHexF+QString::asprintf("%02X", databuff[9+cardnolen-i]);}   //只取4个字节计算8H10D反码}QString SerialNumber="";        //设备全球唯一硬件序号for (int i=10+cardnolen;i<buflen;i++){SerialNumber=SerialNumber+QString::asprintf("%02X", databuff[i]);}bool status;QString Cardno8H10D=QString::asprintf("%010u",CardnoHexF.toUInt(&status,16));  //转8H10D反码卡号QString  DispInf;if (databuff[0]==0xc1){DispInf="读取IC卡号,";}else{DispInf="IC卡离开读卡器,";}DispInf=DispInf+"设备IP:"+IPAddress+",机号:"+DeviceNumber+",数据包号:"+FrameNumber+",16进制卡号:"+CardnoHexZ+",转8H10D反码:"+Cardno8H10D+",设备全球唯一序号:"+SerialNumber;ui->plainTextEdit_msg->setPlainText(DispInf);if(ui->checkBox_Resp->isChecked()){Respondinfo(socketid,getsysdatetime()+"卡号:"+Cardno8H10D);}  //回应驱动设备显示+蜂鸣响声
}//解析读取ID卡卡号-------------------------------------------------------------------------------------------------------------------
void MainWindow::Analyze_d1_df(int socketid,unsigned char databuff[], qint64 buflen)
{QString IPAddress=QString::asprintf("%d", databuff[1])+"."+QString::asprintf("%d", databuff[2])+"."+QString::asprintf("%d", databuff[3])+"."+QString::asprintf("%d", databuff[4]); //设备IP地址,广域网上使用,一般不对此IP回应,而是对数据流的 ip及端口 回应QString DeviceNumber=QString::asprintf("%05d",databuff[5]+databuff[6]*256);   //设备自编机号QString FrameNumber=QString::asprintf("%05d",databuff[7]+databuff[8]*256);    //数据包号QString CardnoHexZ="";          //16进制卡号正码QString CardnoHexF="";          //16进制卡号反码for (int i=0;i<5;i++){CardnoHexZ=CardnoHexZ+QString::asprintf("%02X", databuff[9+i]);if(i<4){CardnoHexF=CardnoHexF+QString::asprintf("%02X", databuff[9+3-i]);}   //只取4个字节计算8H10D反码}QString SerialNumber="";        //设备全球唯一硬件序号for (int i=9+5;i<buflen;i++){SerialNumber=SerialNumber+QString::asprintf("%02X", databuff[i]);}bool status;QString Cardno8H10D=QString::asprintf("%010u",CardnoHexF.toUInt(&status,16));  //转8H10D反码卡号QString  DispInf;if (databuff[0]==0xd1){DispInf="读取ID卡号,";}else{DispInf="ID卡离开读卡器,";}DispInf=DispInf+"设备IP:"+IPAddress+",机号:"+DeviceNumber+",数据包号:"+FrameNumber+",16进制卡号:"+CardnoHexZ+",转8H10D反码:"+Cardno8H10D+",设备全球唯一序号:"+SerialNumber;ui->plainTextEdit_msg->setPlainText(DispInf);if(ui->checkBox_Resp->isChecked()){Respondinfo(socketid,getsysdatetime()+"卡号:"+Cardno8H10D);}  //回应驱动设备显示+蜂鸣响声
}void MainWindow::on_btnClose_clicked()
{m_server->close();
}//向指定的客户端发送数据--------------------------------------------------------------------------------------------------------------
void MainWindow::SendBufToSockID(int socketid,QByteArray rbuffer){m_socket=tcpclientlist.at(socketid);m_socket->write(rbuffer);QString RemoIp=m_socket->peerAddress().toString();QString RemoPort=QString::number( m_socket->peerPort());QString SendHex=getsystime()+" Send To: "+(RemoIp+":"+RemoPort+"             ").mid(0,22);SendHex=SendHex+ByteArrayToHexString(rbuffer);listadditems(0,SendHex);
}void MainWindow::on_pushButton_initserver_clicked()
{initserver();
}//驱动读卡器蜂鸣响声-----------------------------------------------------------------------
void MainWindow::on_btnSendbeep_clicked()
{QListWidgetItem *item = ui->listWidget_online->currentItem();int row = ui->listWidget_online->row(item);if(row<0){QMessageBox::critical(this, "警告", "请选择一台在线设备再执行此功能!", QMessageBox::Ok);}else{QByteArray sendData;sendData.append(0x96);                             //功能码quint16 devno=0;sendData.append(devno % 256);                      //机号低位sendData.append(devno / 256);                      //机号高位,高低位都为0表示任意机号sendData.append(ui->CBbeep->currentIndex());       //蜂鸣响声代码SendBufToSockID(row,sendData);}
}//驱动读卡器开启继电器-----------------------------------------------------------------------
void MainWindow::on_btnswitchon_clicked()
{QListWidgetItem *item = ui->listWidget_online->currentItem();int row = ui->listWidget_online->row(item);if(row<0){QMessageBox::critical(this, "警告", "请选择一台在线设备再执行此功能!", QMessageBox::Ok);}else{QByteArray sendData;sendData.append(0x78);                             //功能码quint16 devno=0;sendData.append(devno % 256);                      //机号低位sendData.append(devno / 256);                      //机号高位,高低位都为0表示任意机号QString swithno="F"+QString::asprintf("%d",ui->CBSwitch->currentIndex());bool status;sendData.append(swithno.toUInt(&status,16));       //选择继电器quint16 deltime=ui->spinBox_swit->value();sendData.append(deltime % 256);                    //开启延时低位sendData.append(deltime / 256);                    //开启延时高位SendBufToSockID(row,sendData);}
}//驱动读卡器关闭已开启的继电器-----------------------------------------------------------------
void MainWindow::on_btnswitchoff_clicked()
{QListWidgetItem *item = ui->listWidget_online->currentItem();int row = ui->listWidget_online->row(item);if(row<0){QMessageBox::critical(this, "警告", "请选择一台在线设备再执行此功能!", QMessageBox::Ok);}else{QByteArray sendData;sendData.append(0x78);                             //功能码quint16 devno=0;sendData.append(devno % 256);                      //机号低位sendData.append(devno / 256);                      //机号高位,高低位都为0表示任意机号QString swithno="E"+QString::asprintf("%d",ui->CBSwitch->currentIndex());bool status;sendData.append(swithno.toUInt(&status,16));       //选择继电器quint16 deltime=ui->spinBox_swit->value();sendData.append(deltime % 256);                    //开启延时低位sendData.append(deltime / 256);                    //开启延时高位SendBufToSockID(row,sendData);}
}//驱动读卡器蜂鸣响声并显示文字---------------------------------------------------------------------
void MainWindow::on_btnDispbeep_clicked()
{QListWidgetItem *item = ui->listWidget_online->currentItem();int row = ui->listWidget_online->row(item);if(row<0){QMessageBox::critical(this, "警告", "请选择一台在线设备再执行此功能!", QMessageBox::Ok);}else{QByteArray sendData;sendData.append(0x5A);                             //功能码quint16 devno=0;sendData.append(devno % 256);                      //机号低位sendData.append(devno / 256);                      //机号高位,高低位都为0表示任意机号sendData.append(ui->CBbeep->currentIndex());       //蜂鸣响声代码,255表示不响声sendData.append(ui->spinBox_dispdelay->value());   //文字显示时长,QString dispstr=ui->textEdit_disp->toPlainText()+"                                  ";  //加空格是为了确保满屏34位显示QByteArray Dispbyte=dispstr.toLocal8Bit();for(int i=0;i<34;i++){sendData.append(Dispbyte[i]);}SendBufToSockID(row,sendData);}
}//驱动读卡器蜂鸣响声+显示文字+播报TTS语音+开启继电器开关
void MainWindow::on_btndispbeeptts_clicked()
{QListWidgetItem *item = ui->listWidget_online->currentItem();int row = ui->listWidget_online->row(item);if(row<0){QMessageBox::critical(this, "警告", "请选择一台在线设备再执行此功能!", QMessageBox::Ok);}else{if(ui->spinBox_voice->value()>16){ui->spinBox_voice->setValue(16);} //tts最大语音取值16QString strls="[v"+QString::asprintf("%d",ui->spinBox_voice->value())+"]";strls=strls+ui->textEdit_tts->toPlainText().trimmed();QByteArray SpeakArr=strls.toLocal8Bit();         //TS语音转换为Ansi码quint8 speakbytes=SpeakArr.size();quint8 dispbytes=34;                //双行显示屏显示长度34,四行屏显示长度72QByteArray sendData;sendData.append(0x5c);                             //功能码quint16 devno=0;sendData.append(devno % 256);                      //机号低位sendData.append(devno / 256);                      //机号高位,高低位都为0表示所有机sendData.append(ui->CBbeep->currentIndex());       //蜂鸣响声代码,取值255表示不响QString swithno="F"+QString::asprintf("%d",ui->CBSwitch->currentIndex());bool status;sendData.append(swithno.toUInt(&status,16));       //选择继电器quint16 deltime=ui->spinBox_swit->value();sendData.append(deltime % 256);                    //延时低位sendData.append(deltime / 256);                    //延时高位sendData.append(ui->spinBox_dispdelay->value());   //文字显示时长,quint8 begindisp =0;                               //在显示屏中的哪个位置开始显示,一般取0sendData.append(begindisp);sendData.append(dispbytes);                        //显示文字长度sendData.append(speakbytes);                       //tts语音长茺QString dispstr=ui->textEdit_disp->toPlainText()+"                                  ";  //加空格是为了确保满屏34位显示QByteArray Dispbyte=dispstr.toLocal8Bit();for(int i=0;i<dispbytes;i++){sendData.append(Dispbyte[i]);       //显示信息}for(int i=0;i<speakbytes;i++){sendData.append(SpeakArr[i]);       //TTS语音信息}sendData.append(0x55);      //防干扰后缀sendData.append(0xaa);sendData.append(0x66);sendData.append(0x99);SendBufToSockID(row,sendData);}
}//接收到刷卡数据立即回应--------------------------------------------------------------------------
void MainWindow::Respondinfo(int socketid,QString Dispinf)
{QByteArray RespBuff;RespBuff.append(0x5A);                             //功能码quint16 devno=0;RespBuff.append(devno % 256);                      //机号低位RespBuff.append(devno / 256);                      //机号高位,高低位都为0表示任意机RespBuff.append(ui->CBbeep->currentIndex());       //蜂鸣响声代码,255表示不响声RespBuff.append(ui->spinBox_dispdelay->value());   //文字显示时长,QString dispstr=Dispinf+"                                  ";  //加空格是为了确保满屏34位显示QByteArray Dispbyte=dispstr.toLocal8Bit();for(int i=0;i<34;i++){RespBuff.append(Dispbyte[i]);}m_socket=tcpclientlist.at(socketid);m_socket->write(RespBuff);QString RemoIp=m_socket->peerAddress().toString();QString RemoPort=QString::number( m_socket->peerPort());QString SendHex=getsystime()+" Send To: "+(RemoIp+":"+RemoPort+"             ").mid(0,22);SendHex=SendHex+ByteArrayToHexString(RespBuff);listadditems(0,SendHex);
}void MainWindow::on_btncopyreport_clicked()
{QString listinf;int row=ui->listWidget_report->count();if (row<1){return;}else{for (int i=0;i<row;i++){QListWidgetItem *item = ui->listWidget_report->item(i);listinf=listinf+item->text()+"\n";}QClipboard *clipboard = QApplication::clipboard();clipboard->setText(listinf);QMessageBox::information(this, "提示", "显示数据报文已拷贝到剪切板");}
}

源码下载 :https://download.csdn.net/download/zhangjin7422/89421064

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

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

相关文章

Lexar NM620 512GB SSD PCIE3.0 X4测评

Lexar NM620 512GB SSD PCIE3.0 X4测评 官方可选容量256GB~2TB PCIE 3.0X4 支持NVME 1.4协议 CDM顺序Read速度3448MB\s CDM顺序Write速度2626MB\s CDM 4K随机Read速度465MB\s CDM 4K随机Write速度602MB\s AS SSD顺序Read速度为2855MB\s AS SSD顺序Write速度为2331MB\s AS SSD…

几款让你怦然心动的神奇工具——搜嗖工具箱

alteredqualia AlteredQualia 脑洞爆炸器网站&#xff0c;不得不说这是一个神奇的网站&#xff0c;在这个网站上你可以实现不可思议的各种操作&#xff0c;让我们对网站有了新的认知&#xff0c;因为它告诉你不是所有有趣的网站都那么花哨&#xff0c;有些网站看着外形平淡无奇…

LabVIEW结构体内部缺陷振动检测

结构体内部缺陷会改变其振动特性&#xff0c;通过振动分析可以检测并定位这些缺陷。本文详细分析内部缺陷对振动的影响&#xff0c;从频谱分析、时域分析和模态分析等多角度探讨基于LabVIEW的检测方法&#xff0c;提供实施步骤和注意事项&#xff0c;帮助工程师有效利用LabVIEW…

如何解决跨境传输常见的安全及效率问题?

在当今全球化的商业版图中&#xff0c;企业为了拓展国际市场和增强竞争力&#xff0c;跨境传输数据已成为一项不可或缺的业务活动。合格的数据跨境传输方案&#xff0c;应考虑以下要素&#xff1a; 法律合规性&#xff1a;确保方案符合所有相关国家的数据保护法律和国际法规&am…

ATF是如何完成双系统切换的?

ATF&#xff08;Arm Trusted Firmware&#xff09;是一个用于ARM架构处理器的可信固件&#xff0c;它最初提供的最主要的功能就是&#xff1a;双系统切换和电源管理。 那么如何进行双系统切换呢&#xff0c;在双系统切换的示例中&#xff0c;除了CPU的跳转&#xff0c;例如CPU…

动态功能连接评估方法的变异性

摘要 背景&#xff1a;动态功能连接(dFC)已成为理解大脑功能的一种重要测量指标。虽然已经开发了各种各样的方法来评估dFC&#xff0c;但目前尚不清楚方法的选择会如何影响结果。在这里&#xff0c;本研究旨在考察常用dFC方法的结果变异性。 方法&#xff1a;本研究在Python中…

阻塞IO、非阻塞IO、IO复用的区别 ?(非常详细)零基础入门到精通,收藏这一篇就够了

前言 在《Unix网络编程》一书中提到了五种IO模型&#xff0c;分别是&#xff1a;阻塞IO、非阻塞IO、IO复用、信号驱动IO以及异步IO。本篇文章主要介绍IO的基本概念以及阻塞IO、非阻塞IO、IO复用三种模型&#xff0c;供大家参考学习。 一、什么是IO 计算机视角理解IO: 对于计…

VD1011 单节锂离子充电电池保护 2.8V过放保护 SOT-23小封装芯片

VD1011&#xff0c;内置高精度电压检测电路和延迟电路以及内置MOSFET&#xff0c;是用于单节锂离子/锂聚合物可再充电 电池的保护IC。 本IC适合干对1节锂离子/锂聚合物可再充电电池的过充电、过放电和过电流进行保护。 VD1011具备如下特点 高精度电压检测电路 过充电检测电压 …

JDK8-17新特性

一、JDK8新特性:Lambda表达式 1.Lambda表达式及其使用举例 Lambda是一个匿名函数&#xff0c;我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格&#xff0c;使Java的语言表达能力…

nc网络收发测试-tcp客户端\TCP服务器\UDP\UDP广播

netcat&#xff08;nc&#xff09;&#xff1a; 作用&#xff1a;一个功能强大的网络工具&#xff0c;提供了简单的网络测试和网络编程功能。工作原理&#xff1a;可以用于建立TCP或UDP连接&#xff0c;并发送和接收数据。示例用法&#xff1a; 监听TCP端口&#xff1a;nc -l 1…

django学习入门系列之第二点《浏览器能识别的标签4》

文章目录 input类型下拉框多行文本往期回顾 input类型 1&#xff1a;打出后可以在里面编写内容 <!-- 自闭合标签 --> <!-- 默认行内标签 --> <input type"text">placeholder 显示背景 <input type"text" id"txtUser" p…

如何在Spring Boot中实现图片上传至本地和阿里云OSS

在开发Web应用时&#xff0c;处理文件上传是常见的需求之一&#xff0c;尤其是在涉及到图片、视频等多媒体数据时。本文将详细介绍如何使用Spring Boot实现图片上传至本地服务器以及阿里云OSS存储服务&#xff0c;并提供完整的代码示例。 一、上传图片至本地 首先&#xff0c…

逻辑这回事(五)---- 资源优化

基础篇 Memory 避免细碎的RAM。将大的RAM拆分成多个小RAM&#xff0c;并根据地址关断可以优化功耗&#xff0c;但把多个小RAM合成大RAM可以优化面积。Block RAM和分布式RAM合理选择。根据存储容量&#xff0c;对Block RAM和分布式RAM的实现面积和功耗进行评估&#xff0c;选择…

文章MSM_metagenomics(三):Alpha多样性分析

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 本教程使用基于R的函数来估计微生物群落的香农指数和丰富度&#xff0c;使用MetaPhlAn prof…

签约喜报 | Smartbi朋友圈又添新朋友啦~

近期&#xff0c;一系列业界翘楚如国际精密集团、惠达卫浴、华天科技、中国人寿等新老朋友纷纷携手Smartbi&#xff0c;共同探索数据驱动业务的新路径、新思路。 Smartbi数10年专注于商业智能BI与大数据分析软件与服务&#xff0c;为各行各业提供提供一站式商业智能平台&#x…

视频转换器在线哪个好?让视频播放不受格式限制

在日常的视频观看中&#xff0c;我们可能会遇到视频格式与设备不兼容的问题&#xff0c;导致无法顺畅播放。这就像是缺少了播放的钥匙&#xff0c;让人无法享受视频内容。 面对视频格式不兼容的挑战&#xff0c;选择合适的转换工具至关重要。但不用担心&#xff0c;本文将分享…

通义千问2(Qwen2)大语言模型在PAI-QuickStart的微调、评测与部署实践

Qwen2&#xff08;通义千问2&#xff09;是阿里云最近推出的开源大型语言模型系列&#xff0c;相比2月推出的Qwen1.5&#xff0c;Qwen2实现了整体性能的代际飞跃&#xff0c;大幅提升了代码、数学、推理、指令遵循、多语言理解等能力。其中&#xff0c;Qwen2系列包含5个尺寸的预…

好像也没那么失望!SD3玩起来,Stable Diffusion 3工作流商业及广告设计(附安装包)

今天基于SD3 base 工作流来尝试进行下广告设计&#xff0c;这要是一配上设计文案&#xff0c;视觉感就出来了。下面来看看一些效果展示~ SD3 Medium模型及ComfyUI工作流下载地址&#xff1a;文末领取&#xff01; 1.清凉夏日——西瓜音乐会 提示词&#xff1a; a guitar wi…

停止游戏中的循环扣血显示

停止游戏中循环扣血并显示的具体实现方式会依赖于你的代码结构和游戏的逻辑。通常情况下&#xff0c;你可以通过以下方式来实现停止循环扣血和显示&#xff1a; 1、问题背景 在使用 Python 代码为游戏开发一个生命值条时&#xff0c;遇到了一个问题。代码使用了循环来减少生命…

Studio One软件最新版下载及详细安装教程

Studio One 6是一款功能丰富、专业级的音乐制作软件&#xff0c;它具备灵活的工作流程和高效的团队协作能力&#xff0c;能帮助用户实现高质量的音乐创作和制作。 智能模板更快的启动&#xff0c;全新的智能模板为你手头的任务提供了必要的工具集&#xff0c;包括基本录制、混音…