当前位置:网站首页>Unicast, multicast, broadcast, tool development, introduction to QT UDP communication protocol development and source code of development tools
Unicast, multicast, broadcast, tool development, introduction to QT UDP communication protocol development and source code of development tools
2022-07-24 05:59:00 【Joey Boye o (* ^ ^ ^ *) o】
Preface
Qt Creator Is a Qt Development of lightweight cross platform integrated development environment .Qt Creator There are two key benefits : Provide the first integrated development environment designed to support cross platform development (IDE), And make sure the first contact Qt Framework developers can quickly start and operate . Even without development Qt Applications ,Qt Creator It's also easy to use and powerful IDE.
Many applications only support UDP, Such as : Multimedia data stream , No additional data will be generated , Don't resend even if you know that there are broken packets . When transmission performance is emphasized instead of transmission integrity , Such as : Audio and multimedia applications ,UDP Is the best choice . In data transmission time is very short , So that the previous connection process becomes the main body of the whole traffic ,UDP It's also a good choice .
One 、UDP unicast 、 Multicast 、 radio broadcast .
unicast
- Information is received and transmitted only between two nodes
- In the same network segment, it is transferred from one originator to one receiver
Multicast
- Multicast is generally through multicast IP Address to achieve . Multicast IP The address is D class IP Address , namely 224.0.0.0 to 239.255.255.255 Between IP Address .
- Method of multicast , The sender transmits the data to a multicast IP Address , The receiving end grabs information by joining multicast .
radio broadcast
- stay IP In the network , For broadcast address IP Address “255.255.255.255” To express , This IP The address represents all in the same subnet IP Address .
- Through the address 255, To the entire network segment (1~255) Sending information will cause network storm if it is not handled well .
Two 、 unicast 、 Multicast 、 radio broadcast 、 The source code and effect diagram of the tool development are as follows
Figure 1

Figure 2

Precautions are shown in the figure

Need to be in Engineering xxx.pro Add... To the document
QT +=network
UDP_family The source code of the development project is as follows
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMainWindow>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QGridLayout>
#include <QDebug>
#include <QTextEdit>
#include <QUdpSocket>
#include <QTime>
#include <QLine>
#include <QNetworkDatagram>
#include <QComboBox>
#include <QByteArray> // Byte conversion 16 Base number
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
public:
void mylayout();
protected:
QComboBox *box;
QComboBox *m_box;
QComboBox *g_box;
QLine *Line;
QLine *Line_1;
QPushButton *button_1;
QPushButton *button_2;
QPushButton *button_3;
QPushButton *button_4;
QPushButton *button_5;
QPushButton *m_button_1;
QPushButton *m_button_2;
QPushButton *m_button_3;
QPushButton *m_button_4;
QPushButton *m_button_5;
QPushButton *g_button_1;
QPushButton *g_button_2;
QPushButton *g_button_3;
QPushButton *g_button_4;
QPushButton *g_button_5;
QLineEdit *edit_1;
QLineEdit *edit_2;
QLineEdit *edit_3;
QLineEdit *edit_4;
QLineEdit *edit_5;
QLineEdit *m_edit_1;
QLineEdit *m_edit_2;
QLineEdit *m_edit_3;
QLineEdit *m_edit_4;
QLineEdit *m_edit_5;
QLineEdit *g_edit_1;
QLineEdit *g_edit_2;
QLineEdit *g_edit_3;
QLineEdit *g_edit_4;
QLineEdit *g_edit_5;
QLabel *x_bel_1;
QLabel *x_bel_2;
QLabel *x_bel_3;
QLabel *bel_1;
QLabel *bel_2;
QLabel *bel_3;
QLabel *bel_4;
QLabel *bel_5;
QLabel *bel_6;
QLabel *m_bel_1;
QLabel *m_bel_2;
QLabel *m_bel_3;
QLabel *m_bel_4;
QLabel *m_bel_5;
QLabel *m_bel_6;
QLabel *g_bel_1;
QLabel *g_bel_2;
QLabel *g_bel_3;
QLabel *g_bel_4;
QLabel *g_bel_5;
QLabel *g_bel_6;
QTextEdit *Text_1;
QTextEdit *m_Text_1;
QTextEdit *g_Text_1;
QGridLayout *layout;
private slots: // unicast
void button_1_clicked();
void button_2_clicked();
void button_3_clicked();
void button_4_clicked();
void button_5_clicked();
void receiveData();
void parseData(QString &str1);
QString Byte2Acsii(uchar *Data,int iLength);
private slots: // Multicast
void reayRead_on();
void on_pushButton_1clicked();
void on_pushButton_2clicked();
void on_pushButton_3clicked();
void on_pushButton_4clicked();
void on_pushButton_5clicked();
private slots: // radio broadcast
void g_button_1_clicked();
void g_button_2_clicked();
void g_button_3_clicked();
void g_button_4_clicked();
void g_button_5_clicked();
void processData();
private: // unicast QUdoSocket
QUdpSocket *m_sender;
QUdpSocket *m_receiver;
private: // radio broadcast QUdoSocket
QUdpSocket *g_sender;
QUdpSocket *g_receiver;
private: // Multicast QUdpSocket
QUdpSocket* udpSocket;
QHostAddress groupAddress;
private: // Variables used by unicast
qint16 port_1;
qint16 port;
QString ip;
QString strdata;
QString box_data;
QString str_16;
QString str3;
QByteArray hex_bytes;
private: // Variables used by multicast
QString m_str;
QString m_ip;
qint16 m_port;
qint16 m_port_1;
QString m_box_data;
private: // Variables used for broadcasting
QString g_str;
QString g_ip;
qint16 g_port;
qint16 g_port_1;
QString g_box_data;
private:
int type_a;
int m_type_a;
int g_type_a;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
w.mylayout();
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);
}
Widget::~Widget()
{
delete ui;
}
void Widget::mylayout()
{
m_sender = new QUdpSocket(this);
m_receiver =new QUdpSocket(this);
g_sender = new QUdpSocket(this);
g_receiver = new QUdpSocket(this);
connect(g_receiver,&QUdpSocket::readyRead,this,&Widget::processData); // radio broadcast
connect(m_receiver,&QUdpSocket::readyRead,this,&Widget::receiveData); // unicast
udpSocket = new QUdpSocket(this);
connect(udpSocket ,&QUdpSocket::readyRead,this,&Widget::reayRead_on); // Multicast
box = new QComboBox;
m_box = new QComboBox;
g_box = new QComboBox;
x_bel_1 = new QLabel(" Unicast tools ");
x_bel_2 = new QLabel(" Multicast tools ");
x_bel_3 = new QLabel(" Broadcast tools ");
edit_1 = new QLineEdit; // Input port ip data
edit_2 = new QLineEdit; //ip
edit_3 = new QLineEdit; // data
edit_4 = new QLineEdit; // Local port
edit_5 = new QLineEdit; //16 Hexadecimal receive bytes
m_edit_1 = new QLineEdit; // Input port
m_edit_2 = new QLineEdit; // Input port ip
m_edit_3 = new QLineEdit; // Input Local port
m_edit_4 = new QLineEdit; // Input port data
m_edit_5 = new QLineEdit; // Input port data
g_edit_1 = new QLineEdit; // Input port
g_edit_2 = new QLineEdit; // Input port ip
g_edit_3 = new QLineEdit; // Input Local port
g_edit_4 = new QLineEdit; // Input port data
g_edit_5 = new QLineEdit; // Input port data
bel_1 = new QLabel(" Set the target port :");
bel_2 = new QLabel(" Set the destination address :");
bel_3 = new QLabel(" Set local port :");
bel_4 = new QLabel(" The data transfer :");
bel_5 = new QLabel(" Format characters :");
bel_6 = new QLabel(" Set receive bytes :");
m_bel_1 = new QLabel(" Set the target port :");
m_bel_2 = new QLabel(" Set the destination address :");
m_bel_3 = new QLabel(" Set local port :");
m_bel_4 = new QLabel(" The data transfer :");
m_bel_5 = new QLabel(" Format characters ");
m_bel_6 = new QLabel(" Set receive bytes :");
g_bel_1 = new QLabel(" Set the target port :");
g_bel_2 = new QLabel(" Set the destination address :");
g_bel_3 = new QLabel(" Set local port :");
g_bel_4 = new QLabel(" The data transfer :");
g_bel_5 = new QLabel(" Format characters ");
g_bel_6 = new QLabel(" Set receive bytes :");
button_1 = new QPushButton(" Set up information ");
button_2 = new QPushButton(" Bind local port ");
button_3 = new QPushButton(" Single broadcast to send ");
button_4 = new QPushButton(" Unbind local port ");
button_5 = new QPushButton(" Clear received data ");
m_button_1 = new QPushButton(" Set up information ");
m_button_2 = new QPushButton(" Bind local port ");
m_button_3 = new QPushButton(" Multicast send ");
m_button_4 = new QPushButton(" Unbind local port ");
m_button_5 = new QPushButton(" Clear received data ");
g_button_1 = new QPushButton(" Set up information ");
g_button_2 = new QPushButton(" Bind local port ");
g_button_3 = new QPushButton(" Broadcast transmission ");
g_button_4 = new QPushButton(" Unbind local port ");
g_button_5 = new QPushButton(" Clear received data ");
Text_1 = new QTextEdit;
m_Text_1 = new QTextEdit;
g_Text_1 = new QTextEdit;
button_1->setMinimumHeight(50);
button_2->setMinimumHeight(50);
button_3->setMinimumHeight(50);
button_4->setMinimumHeight(50);
button_5->setMinimumHeight(50);
Text_1->setMinimumHeight(100);
m_Text_1->setMinimumHeight(100);
g_Text_1->setMinimumHeight(100);
m_button_1->setMinimumHeight(50);
m_button_2->setMinimumHeight(50);
m_button_3->setMinimumHeight(50);
m_button_4->setMinimumHeight(50);
m_button_5->setMinimumHeight(50);
g_button_1->setMinimumHeight(50);
g_button_2->setMinimumHeight(50);
g_button_3->setMinimumHeight(50);
g_button_4->setMinimumHeight(50);
g_button_5->setMinimumHeight(50);
layout = new QGridLayout(this);
QFont font("Microsoft YaHei", 14, 75);
//font.setPointSize(14);
x_bel_1->setFont(font);
x_bel_2->setFont(font);
x_bel_3->setFont(font);
layout->addWidget(x_bel_1,0,0);
layout->addWidget(x_bel_2,0,5);
layout->addWidget(x_bel_3,0,10);
layout->addWidget(bel_1,1,0);
layout->addWidget(bel_2,2,0);
layout->addWidget(bel_3,3,0);
layout->addWidget(bel_4,4,0);
layout->addWidget(bel_5,8,0);
layout->addWidget(bel_6,8,2);
layout->addWidget(edit_1,1,1,1,3);
layout->addWidget(edit_2,2,1,1,3);
layout->addWidget(edit_3,3,1,1,3);
layout->addWidget(edit_4,4,1,1,3);
layout->addWidget(edit_5,8,3);
layout->addWidget(button_1,5,0);
layout->addWidget(button_2,5,1);
layout->addWidget(button_3,5,2);
layout->addWidget(button_4,5,3);
layout->addWidget(button_5,6,0,1,4);//(x,y, Long , wide )
layout->addWidget(Text_1,7,0,1,4);
connect(button_1,SIGNAL(clicked(bool)),this,SLOT(button_1_clicked()));
connect(button_2,SIGNAL(clicked(bool)),this,SLOT(button_2_clicked()));
connect(button_3,SIGNAL(clicked(bool)),this,SLOT(button_3_clicked()));
connect(button_4,SIGNAL(clicked(bool)),this,SLOT(button_4_clicked()));
connect(button_5,SIGNAL(clicked(bool)),this,SLOT(button_5_clicked()));
connect(m_button_1,SIGNAL(clicked(bool)),this,SLOT(on_pushButton_1clicked()));
connect(m_button_2,SIGNAL(clicked(bool)),this,SLOT(on_pushButton_2clicked()));
connect(m_button_3,SIGNAL(clicked(bool)),this,SLOT(on_pushButton_3clicked()));
connect(m_button_4,SIGNAL(clicked(bool)),this,SLOT(on_pushButton_4clicked()));
connect(m_button_5,SIGNAL(clicked(bool)),this,SLOT(on_pushButton_5clicked()));
connect(g_button_1,SIGNAL(clicked(bool)),this,SLOT(g_button_1_clicked()));
connect(g_button_2,SIGNAL(clicked(bool)),this,SLOT(g_button_2_clicked()));
connect(g_button_3,SIGNAL(clicked(bool)),this,SLOT(g_button_3_clicked()));
connect(g_button_4,SIGNAL(clicked(bool)),this,SLOT(g_button_4_clicked()));
connect(g_button_5,SIGNAL(clicked(bool)),this,SLOT(g_button_5_clicked()));
// Draw a vertical line
QFrame *line = new QFrame();
QFrame *line_1 = new QFrame();
line->setFrameShape(QFrame::VLine); //HLine It's a horizontal line VLine It's a vertical line
line->setFrameShadow(QFrame::Plain);
line_1->setFrameShape(QFrame::VLine); //HLine It's a horizontal line VLine It's a vertical line
line_1->setFrameShadow(QFrame::Plain);
//line->raise();// Top level display
layout->addWidget(line,0,4,8,4);
layout->addWidget(line_1,0,9,8,4);
// Draw multicast
layout->addWidget(m_edit_1,1,6,1,3);
layout->addWidget(m_edit_2,2,6,1,3);
layout->addWidget(m_edit_3,3,6,1,3);
layout->addWidget(m_edit_4,4,6,1,3);
layout->addWidget(m_edit_5,8,8);
layout->addWidget(m_bel_1,1,5);
layout->addWidget(m_bel_2,2,5);
layout->addWidget(m_bel_3,3,5);
layout->addWidget(m_bel_4,4,5);
layout->addWidget(m_bel_5,8,5);
layout->addWidget(m_bel_6,8,7);
layout->addWidget(m_button_1,5,5);
layout->addWidget(m_button_2,5,6);
layout->addWidget(m_button_3,5,7);
layout->addWidget(m_button_4,5,8);
layout->addWidget(m_button_5,6,5,1,4);
layout->addWidget(m_Text_1,7,5,1,4);
box->addItem("toUtf8");
box->addItem("16");
m_box->addItem("toUtf8");
m_box->addItem("16");
g_box->addItem("toUtf8");
g_box->addItem("16");
layout->addWidget(g_box,8,11);
layout->addWidget(m_box,8,6);
layout->addWidget(box,8,1);
layout->addWidget(g_edit_1,1,11,1,3);
layout->addWidget(g_edit_2,2,11,1,3);
layout->addWidget(g_edit_3,3,11,1,3);
layout->addWidget(g_edit_4,4,11,1,3);
layout->addWidget(g_edit_5,8,13);
layout->addWidget(g_bel_1,1,10);
layout->addWidget(g_bel_2,2,10);
layout->addWidget(g_bel_3,3,10);
layout->addWidget(g_bel_4,4,10);
layout->addWidget(g_bel_5,8,10);
layout->addWidget(g_bel_6,8,12);
layout->addWidget(g_button_1,5,10);
layout->addWidget(g_button_2,5,11);
layout->addWidget(g_button_3,5,12);
layout->addWidget(g_button_4,5,13);
layout->addWidget(g_button_5,6,10,1,4);
layout->addWidget(g_Text_1,7,10,1,4);
}
void Widget::button_1_clicked() // Set up information
{
box_data = box->currentText();
qDebug()<<box_data;
type_a= edit_5->text().toInt();
port = edit_1->text().toInt();
ip = edit_2->text();
Text_1->append(" Set message successfully !");
}
void Widget::button_2_clicked() // Bind local port
{
port_1 = edit_3->text().toInt();
m_receiver->bind(port_1);
Text_1->append(" Bind local port !");
}
void Widget::button_3_clicked() // Single broadcast to send
{
if(box_data=="toUtf8")
{
strdata = edit_4->text().toUtf8();
m_sender->writeDatagram(strdata.toUtf8(),QHostAddress(ip),port);
Text_1->append( " Send successfully !");
}
if(box_data=="16")
{
bool ok;
strdata = edit_4->text();
int length = strdata.size()/3+1;
uchar array[length];
for(int i = 0; i<=length; i++)
{
array[i] = (uchar) strdata.mid(i*3,2).toUInt(&ok,16);
}
char *p = (char *)array;
m_sender->writeDatagram(p,QHostAddress(ip),port);
Text_1->append( " Send successfully !");
}
}
void Widget::button_4_clicked() // Unbind local port
{
m_receiver->abort();
Text_1->append(" Unbind local port succeeded !");
}
void Widget::button_5_clicked() // Clear received shuju
{
Text_1->clear();
Text_1->append(" Clear successfully !");
}
void Widget::receiveData()
{
char buf[type_a];
memset(buf,0,sizeof(buf));
QHostAddress cliAddr; // Used to store received ip Address
quint16 port_2; // Used to store the received port address
qint64 len = m_receiver-> readDatagram(buf, sizeof(buf), &cliAddr, &port_2);
if(len > 0)
{
QTime cur_time = QTime::currentTime();
QString time_info = cur_time.toString("hh:mm:ss");
QString str1 =cliAddr.toString() ;
parseData(str1);
QString str = QString(" The received IP yes %1\n The received port is %2\n Data received %3\n The current time is %4\n")
.arg(str1)
.arg(port_2)
.arg(buf)
.arg(time_info);
if(box_data=="toUtf8")
{
Text_1->append(str.toUtf8());/* according to append Save the format of to text The output has a slider */
}
if(box_data=="16")
{
uchar *p = (uchar *)buf;
Text_1->append(Byte2Acsii(p, sizeof(buf)));
}
}
}
/* Multicast area */
void Widget::on_pushButton_1clicked()
{
m_box_data = m_box->currentText();
m_str =m_edit_4->text().toUtf8();
m_ip = m_edit_2->text();
m_port =m_edit_1->text().toInt();
m_port_1 = m_edit_3->text().toInt();
m_type_a = m_edit_5->text().toInt();
m_Text_1->append( " Set message successfully !");
}
void Widget::on_pushButton_2clicked()
{
if(udpSocket->state() != QAbstractSocket::BoundState) // Determine whether to bind the port
{
bool ret = udpSocket->bind(QHostAddress::AnyIPv4, m_port_1, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); // When using multicast, you must specify AnyIPv4, If not specified, it will default to Any, Joining multicast will fail
// Bind the port that receives data , Generally use multicast port
// ShareAddress Allow multiple programs on a computer to bind to the same port , To facilitate the test , But in windows You need to add ReuseAddressHint It works
if(ret)
{
qInfo() << " Bind local address successfully !";
ret = udpSocket->joinMulticastGroup(QHostAddress(m_ip)); // Join multicast group
if(ret)
{
m_Text_1->append( " Join multicast group successfully , Bind port succeeded !");
}
else
{
m_Text_1->append( " Failed to join multicast group !");
m_Text_1->append( " Please check whether the information is set and whether the multicast address is entered , Please unbind the port , Reset information !");
}
}
else
{
m_Text_1->append( " Failed to bind local address !");
}
}
else
{
m_Text_1->append( "udpSocket Open the failure !");
}
}
void Widget::on_pushButton_3clicked()
{
qint16 len = udpSocket->writeDatagram(m_str.toUtf8(),QHostAddress(m_ip),m_port);
//qInfo()<<QString(" Send data length :%1").arg(len);
m_Text_1->append( " Send successfully !");
}
void Widget::on_pushButton_4clicked()
{
udpSocket->abort();
m_Text_1->append( " Unbind succeeded !");
}
void Widget::on_pushButton_5clicked()
{
m_Text_1->clear();
m_Text_1->append( " Clear successfully !");
}
void Widget::reayRead_on()
{
QHostAddress cliAddr; // Used to store received ip Address
quint16 port_2; // Used to store the received port address
char buf[m_type_a];
memset(buf,0,sizeof(buf));
qint64 len = udpSocket-> readDatagram(buf, sizeof(buf), &cliAddr, &port_2);
if(len > 0)
{
QTime cur_time = QTime::currentTime();
QString time_info = cur_time.toString("hh:mm:ss");
QString str1 =cliAddr.toString() ;
parseData(str1);
QString str = QString(" The received IP yes %1\n The received port is %2\n Data received %3\n The current time is %4\n")
.arg(str1)
.arg(port_2)
.arg(buf)
.arg(time_info);
if(m_box_data=="toUtf8")
{
m_Text_1->append(str.toUtf8());/* according to append Save the format of to text The output has a slider */
}
if(m_box_data=="16")
{
uchar *p = (uchar *)buf; // Cast uses pointers char transformation unsigned char
m_Text_1->append(Byte2Acsii(p, sizeof(buf)));
}
}
}
/******** radio broadcast *******/
void Widget::g_button_1_clicked()
{
g_box_data = g_box->currentText();
g_ip = g_edit_2->text();
g_port = g_edit_1->text().toInt();
g_port_1 = g_edit_3->text().toInt();
g_type_a = g_edit_5->text().toInt();
g_Text_1->append( " Set message successfully !");
}
void Widget::g_button_2_clicked()
{
g_receiver->bind(g_port_1,QUdpSocket::ShareAddress);
g_Text_1->append( " Bind local port successfully !");
}
void Widget::g_button_3_clicked()
{
if(g_box_data=="toUtf8")
{
g_str =g_edit_4->text().toUtf8();
g_sender->writeDatagram(g_str.toUtf8(),QHostAddress(g_ip),g_port);
g_Text_1->append( " Send successfully !");
}
if(g_box_data=="16")
{
g_str =g_edit_4->text();
bool ok;
int length = g_str.size()/3+1;
uchar array[length];
for(int i = 0; i<=length; i++)
{
array[i] = (uchar) g_str.mid(i*3,2).toUInt(&ok,16);
}
char *p = (char *)array;
g_sender->writeDatagram(p,QHostAddress(g_ip),g_port);
g_Text_1->append( " Send successfully !");
}
}
void Widget::g_button_4_clicked()
{
g_receiver->abort();
g_Text_1->append(" Unbind local port succeeded !");
}
void Widget::g_button_5_clicked()
{
g_Text_1->clear();
g_Text_1->append(" Clear successfully !");
}
void Widget::processData()
{
char buf[g_type_a];
memset(buf,0,sizeof(buf));
QHostAddress cliAddr; // Used to store received ip Address
quint16 port_2; // Used to store the received port address
qint64 len = g_receiver-> readDatagram(buf, sizeof(buf), &cliAddr, &port_2);
if(len > 0)
{
QTime cur_time = QTime::currentTime();
QString time_info = cur_time.toString("hh:mm:ss");
QString str1 =cliAddr.toString() ;
parseData(str1);
QString str = QString(" The received IP yes %1\n The received port is %2\n Data received %3\n The current time is %4\n")
.arg(str1)
.arg(port_2)
.arg(buf)
.arg(time_info);
if(g_box_data=="toUtf8")
{
g_Text_1->append(str.toUtf8());/* according to append Save the format of to text The output has a slider */
qDebug()<<"b";
}
if(g_box_data=="16")
{
uchar *p = (uchar *)buf;
g_Text_1->append(Byte2Acsii(p, sizeof(buf)));
}
}
}
/********************Qstring turn 16 Base number ***************************/
QString Widget::Byte2Acsii(uchar *Data,int iLength)
{
QString ST="",strT;
int iB,iS;
char cB,cS;
//---
for (int i=0;i<iLength;i++)
{
iB = *(Data+i)/16;
if (iB>=10)
{
cB = 'A' + (iB-10);
}
else
cB = '0' + iB;
iS = *(Data+i)%16;
if (iS >= 10)
{
cS = 'A' + (iS-10);
}
else
cS = '0' + iS;
strT=QString("%1%2 ").arg(cB).arg(cS);
ST += strT;
}
return ST;
}
/********* Clear redundant characters in bytes ***********/
void Widget::parseData(QString &str1)
{
char array[]={
'f',':'}; // Characters to be removed
int length = sizeof (array)/sizeof (char);
for(int i=0;i<length;i++)
{
QString tmp = QString(array[i]);
if(str1.contains(tmp))
{
str1 =str1.replace(tmp,"");
}
}
}
UDP_family Project development original file compression package
Decompress the project file and import it directly ,0C Currency download
Qt Difficulties and complications in the process of project development UDP_family Source details
To be updated …
边栏推荐
- bat批处理脚本、同时运行多个文件、按照顺序执行的批处理命令及xshell脚本。
- Machine learning (zhouzhihua) Chapter 5 notes on neural network learning
- Test whether the label and data set correspond after data enhancement
- [activiti] process variables
- Add se channel attention module to the network
- day1-jvm+leetcode
- [MYCAT] related concepts of MYCAT
- 【深度学习】手写神经网络模型保存
- Deepsort summary
- Common methods of array
猜你喜欢

字符串方法以及实例

解决ModularNotFoundError: No module named “cv2.aruco“

Chapter 5 neural network

Typora installation package in November 2021, the last free version of the installation package to download v13.6.1

AD1256

Machine learning (Zhou Zhihua) Chapter 4 notes on learning experience of decision tree

MySql下载,及安装环境设置
![[MYCAT] related concepts of MYCAT](/img/44/99d413d47828252267b5242c64960b.png)
[MYCAT] related concepts of MYCAT

"Statistical learning methods (2nd Edition)" Li Hang Chapter 15 singular value decomposition SVD mind map notes and after-school exercise answers (detailed steps) SVD matrix singular value Chapter 15

tensorflow和pytorch框架的安装以及cuda踩坑记录
随机推荐
Pytorch single machine multi card distributed training
PDF文本合并
Delete the weight of the head part of the classification network pre training weight and modify the weight name
Typora 安装包2021年11月最后一次免费版本的安装包下载V13.6.1
PLSQL query data garbled
Thymeleaf快速入门学习
Sqlserver completely deleted
在网络中添加spp模块中的注意点
主成分分析计算步骤
原生js放大镜效果
JSON. Dumps() function parsing
[deep learning] teach you to write "handwritten digit recognition neural network" hand in hand, without using any framework, pure numpy
JVM系统学习
CRC-16 Modbus代码
systemctl + journalctl
"Statistical learning methods (2nd Edition)" Li Hang Chapter 16 principal component analysis PCA mind map notes and after-school exercise answers (detailed steps) PCA matrix singular value Chapter 16
Machine learning (zhouzhihua) Chapter 1 Introduction notes learning experience
精确计算时间延迟VxWorks 时间戳 详解
Points for attention in adding spp module to the network
学习率优化策略