




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
QT5开发及实例(第5版)第10章Qt5网络通信及实例——获取本机网络信息获取本机网络信息【例】(简单)(CH1001)获得本机网络信息。以“直接编写代码”(即取消勾选“Generateform”复选框)方式创建Qt项目,项目名NetworkInformation,“ClassInformation”页基类选“QWidget”,类名命名为“NetworkInformation”。1.实现界面(1)头文件networkinformation.h代码如下。#include<QWidget>#include<QLabel>#include<QPushButton>#include<QLineEdit>#include<QGridLayout>#include<QMessageBox>classNetworkInformation:publicQWidget{Q_OBJECTpublic:NetworkInformation(QWidget*parent=0);~NetworkInformation();private:QLabel*hostLabel;QLineEdit*LineEditLocalHostName;QLabel*ipLabel;QLineEdit*LineEditAddress;QPushButton*detailBtn;QGridLayout*mainLayout;};获取本机网络信息(2)源文件networkinformation.cpp代码如下:#include"networkinformation.h"NetworkInformation::NetworkInformation(QWidget*parent):QWidget(parent){hostLabel=newQLabel("主机名:");LineEditLocalHostName=newQLineEdit;ipLabel=newQLabel("IP地址:");LineEditAddress=newQLineEdit;detailBtn=newQPushButton("详细");mainLayout=newQGridLayout(this);mainLayout->addWidget(hostLabel,0,0);mainLayout->addWidget(LineEditLocalHostName,0,1);mainLayout->addWidget(ipLabel,1,0);mainLayout->addWidget(LineEditAddress,1,1);mainLayout->addWidget(detailBtn,2,0,1,2);}获取本机网络信息此时,运行程序显示界面如图。获取本机网络信息2.获取信息下面实现获取本机网络信息的功能。(1)在项目的配置文件NetworkI中添加一句:QT+=network(2)在头文件networkinformation.h中添加如下代码:#include<QHostInfo>#include<QNetworkInterface>public:voidgetHostInformation();publicslots:voidslotDetail();获取本机网络信息(3)实现功能函数和槽函数在源文件networkinformation.cpp构造函数的最后添加:getHostInformation();connect(detailBtn,SIGNAL(clicked()),this,SLOT(slotDetail()));功能函数getHostInformation()用于获取主机信息,实现代码如下:voidNetworkInformation::getHostInformation(){QStringlocalHostName=QHostInfo::localHostName(); //(a)LineEditLocalHostName->setText(localHostName);QHostInfohostInfo=QHostInfo::fromName(localHostName); //(b)//获取主机的IP地址列表QList<QHostAddress>listAddress=hostInfo.addresses();if(!listAddress.isEmpty()) //(c){LineEditAddress->setText(listAddress.at(1).toString());}}获取本机网络信息槽函数slotDetail()获取与网络接口相关的信息,实现代码如下:voidNetworkInformation::slotDetail(){QStringdetail="";QList<QNetworkInterface>list=QNetworkInterface::allInterfaces(); //(a)for(inti=0;i<list.count();i++){QNetworkInterfaceinterface=list.at(i);detail=detail+"设备:"+()+"\n"; //(b)detail=detail+"硬件地址:"+interface.hardwareAddress()+"\n"; //(c)QList<QNetworkAddressEntry>entryList=interface.addressEntries(); //(d)for(intj=1;j<entryList.count();j++){QNetworkAddressEntryentry=entryList.at(j);detail=detail+"\t"+"IP地址:"+entry.ip().toString()+"\n";detail=detail+"\t"+"子网掩码:"+mask().toString()+"\n";detail=detail+"\t"+"广播地址:"+entry.broadcast().toString()+"\n";}}QMessageBox::information(this,"Detail",detail);}获取本机网络信息(4)运行程序启动程序,显示本机网络基本信息如图。单击“详细”按钮,弹出如图网络详细信息窗口。QT5开发及实例(第5版)第10章Qt5网络通信及实例——基于UDP的数据通信01UDP工作原理1.UDP简介2.UDP编程步骤UDP工作原理1.UDP简介UDP(UserDatagramProtocol,用户数据报协议)是一种简单、轻量、无连接的传输协议,可以用在对通信可靠性要求不是很高的场合,如以下几种情形:
网络数据大多为短消息。
系统拥有大量客户端。
对数据安全性无特殊要求。
网络负载很重,但对响应速度却要求极高。UDP所收发数据的形式是报文(Datagram),通信时UDP客户端向UDP服务器发送一定长度的请求报文,报文大小的限制与各系统的协议实现有关,但不得超过其下层IP规定的64KB,UDP服务器同样以报文做出应答,如图。UDP工作原理在UDP方式下,客户端并不与服务器建立连接,它只负责调用发送函数向服务器发出数据报。类似地,服务器也不接受客户端的连接,只是调用接收函数被动等待来自某客户端的数据到达。UDP客户端与UDP服务器间的交互时序如图。UDP工作原理2.UDP编程步骤(1)初始化套接字例如,在一个即时通讯系统中,用户之间的文字聊天信息、所有的系统协调通知消息都以UDP收发。为此,在客户端和服务器程序的初始化代码中,都要创建一个QUdpSocket对象绑定到指定端口,并将该对象的readyRead信号关联到接收数据报的recvData函数,语句如下:QUdpSocket*udpsocket=newQUdpSocket(); //创建套接字对象intuport=23232; //(a)udpsocket->bind(uport,QUdpSocket::BindFlag::ShareAddress|QUdpSocket::BindFlag::ReuseAddressHint); //套接字绑定到端口connect(udpsocket,SIGNAL(readyRead()),this,SLOT(recvData())); //(b)UDP工作原理(2)发送数据在初始化套接字后,通信双方都可以调用套接字对象的writeDatagram函数发送数据,语句形如:套接字对象->writeDatagram(数据,地址,UDP端口号);(3)接收数据当有数据到达时,接收方程序响应QUdpSocket的readyRead信号,一旦套接字对象中有数据可读,即通过readDatagram函数将其读出,代码形如:while(套接字对象->hasPendingDatagrams()) //(a){
套接字对象->readDatagram(数据,套接字对象->pendingDatagramSize()); //(b)...... //对收到的数据进行处理}02UDP应用实例1.UDP服务器编程2.UDP客户端编程3.运行演示UDP应用实例【例】(简单)(CH1002)编写一对服务器/客户端程序,用UDP进行字符的收发并显示。1.UDP服务器编程以“直接编写代码”(即取消勾选“Generateform”复选框)方式创建Qt项目,项目名UdpServer,“ClassInformation”页基类选“QDialog”,类名命名为“UdpServer”。1)实现界面(1)在头文件udpserver.h中声明需要的各种控件,代码如下:#include<QDialog>#include<QLabel>#include<QLineEdit>#include<QPushButton>#include<QVBoxLayout>classUdpServer:publicQDialog{Q_OBJECTpublic:UdpServer(QWidget*parent=0,Qt::WindowFlagsf=0);~UdpServer();private:QLabel*TimerLabel;QLineEdit*TextLineEdit;QPushButton*StartBtn;QVBoxLayout*mainLayout;};UDP应用实例(2)在源文件udpserver.cpp中布局程序界面,代码如下:#include"udpserver.h"UdpServer::UdpServer(QWidget*parent,Qt::WindowFlagsf):QDialog(parent,f){setWindowTitle("UDPServer"); //设置窗口标题/*初始化各个控件*/TimerLabel=newQLabel("计时器:",this);TextLineEdit=newQLineEdit(this);StartBtn=newQPushButton("开始",this);/*设置布局*/mainLayout=newQVBoxLayout(this);mainLayout->addWidget(TimerLabel);mainLayout->addWidget(TextLineEdit);mainLayout->addWidget(StartBtn);}此时,运行程序显示服务器界面如图。UDP应用实例2)完成发送数据功能(1)在项目的配置文件UdpS中添加一句:QT+=network(2)在头文件udpserver.h中添加需要的槽函数并声明变量,如下:#include<QUdpSocket>#include<QTimer>publicslots:voidStartBtnClicked();voidtimeout();private:intport;boolisStarted;QUdpSocket*udpSocket;QTimer*timer;UDP应用实例(3)实现槽函数在源文件udpserver.cpp中包含:#include<QHostAddress>并在构造函数中添加如下代码:connect(StartBtn,SIGNAL(clicked()),this,SLOT(StartBtnClicked()));port=5555; //设置UDP的端口号参数,服务器定时向此端口发送广播消息isStarted=false;udpSocket=newQUdpSocket(this); //创建套接字对象timer=newQTimer(this); //创建一个定时器//定时发送广播消息connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));UDP应用实例槽函数StartBtnClicked()负责启停发送,代码如下:voidUdpServer::StartBtnClicked(){if(!isStarted){StartBtn->setText("停止");timer->start(1000);isStarted=true;}else{StartBtn->setText("开始");isStarted=false;timer->stop();}}UDP应用实例槽函数timeout()实现了发送广播消息的功能,代码如下:voidUdpServer::timeout(){QStringmsg=TextLineEdit->text();intlength=0;if(msg==""){return;}if((length=udpSocket->writeDatagram(msg.toLatin1(),msg.length(),QHostAddress::Broadcast,port))!=msg.length()){return;}}UDP应用实例2.UDP客户端编程以“直接编写代码”(即取消勾选“Generateform”复选框)方式创建Qt项目,项目名UdpClient,“ClassInformation”页基类选“QDialog”,类名命名为“UdpClient”。1)实现界面(1)在头文件udpclient.h中声明需要的各种控件,代码如下:#include<QDialog>#include<QVBoxLayout>#include<QTextEdit>#include<QPushButton>classUdpClient:publicQDialog{Q_OBJECTpublic:UdpClient(QWidget*parent=0,Qt::WindowFlagsf=0);~UdpClient();private:QTextEdit*ReceiveTextEdit;QPushButton*CloseBtn;QVBoxLayout*mainLayout;};UDP应用实例(2)在源文件udpclient.cpp中布局程序界面,代码如下:#include"udpclient.h"UdpClient::UdpClient(QWidget*parent,Qt::WindowFlagsf):QDialog(parent,f){setWindowTitle("UDPClient"); //设置窗口标题/*初始化各个控件*/ReceiveTextEdit=newQTextEdit(this);CloseBtn=newQPushButton("Close",this);/*设置布局*/mainLayout=newQVBoxLayout(this);mainLayout->addWidget(ReceiveTextEdit);mainLayout->addWidget(CloseBtn);}运行程序显示客户端界面如图。UDP应用实例2)完成接收数据功能(1)在项目的配置文件UdpC中添加一句:QT+=network(2)在头文件udpclient.h中添加需要的槽函数并声明变量,如下:#include<QUdpSocket>publicslots:voidCloseBtnClicked();voiddataReceived();private:intport;QUdpSocket*udpSocket;UDP应用实例(3)实现槽函数在源文件udpclient.cpp中包含:#include<QMessageBox>#include<QHostAddress>并在构造函数中添加如下代码:connect(CloseBtn,SIGNAL(clicked()),this,SLOT(CloseBtnClicked()));port=5555; //设置UDP的端口号参数,指定在此端口上监听数据udpSocket=newQUdpSocket(this); //创建套接字对象connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));boolresult=udpSocket->bind(port); //将套接字绑定到指定的端口上if(!result){QMessageBox::information(this,"error","udpsocketcreateerror!");return;}UDP应用实例槽函数CloseBtnClicked()只是简单地关闭客户端窗口:voidUdpClient::CloseBtnClicked(){close();}槽函数dataReceived()响应QUdpSocket的readyRead()信号,一旦套接字对象中有数据可读时,即通过readDatagram()方法将数据读出并显示,代码如下:voidUdpClient::dataReceived(){while(udpSocket->hasPendingDatagrams()){QByteArraydatagram;datagram.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(datagram.data(),datagram.size());QStringmsg=datagram.data();ReceiveTextEdit->insertPlainText(msg); //显示数据内容}}UDP应用实例3.运行演示(1)同时启动运行服务器和客户端程序。(2)在服务器界面的文本框中输入“hello!”,然后单击“开始”按钮,按钮文本变为“停止”,客户端就开始不断地收到“hello!”字符消息并显示在文本区。(3)当单击服务器的“停止”按钮后,按钮文本又变回“开始”,客户端也停止了字符的显示。(4)再次单击服务器的“开始”按钮,客户端又继续接收并显示……如此循环往复。整个演示过程的运行效果如图。QT5开发及实例(第5版)第10章Qt5网络通信及实例——基于TCP的数据通信01TCP工作原理1.TCP简介2.TCP编程步骤TCP工作原理1.TCP简介TCP(TransmissionControlProtocol,传输控制协议)是一种可靠、面向数据流且需要建立连接的传输协议,许多高层应用协议(包括HTTP、FTP等)都以它为基础,TCP非常适合数据的连续传输。一个典型的TCP传输文件的过程如下:(1)首先启动服务器,一段时间后启动客户端,它与此服务器经过三次握手后建立连接。(2)此后的一段时间内,客户端向服务器发送一个请求,服务器处理这个请求,并为客户端发回一个响应。这个过程一直持续下去,直到客户端向服务器发一个文件结束符,并关闭客户端连接。(3)接着服务器也关闭服务器端的连接,结束运行或等待一个新的客户端连接。TCP工作原理TCP客户端与TCP服务器间的交互时序如图。TCP工作原理TCP与UDP的比较见表。比较项TCPUDP是否连接面向连接无连接传输可靠性可靠不可靠流量控制提供不提供工作方式全双工可以是全双工应用场合大量数据少量数据速度慢快TCP工作原理2.TCP编程步骤(1)创建TCP服务器和套接字在服务器程序的初始化代码中,既要创建一个TCP服务器对象也要创建一个套接字对象,语句如下:QTcpServer*tcpserver=newQTcpServer(); //创建TCP服务器inttport=5555 ; //TCP监听端口号connect(tcpserver,SIGNAL(newConnection()),this,SLOT(preTrans())); //(a)intpayloadsize=64*1024; //缓存每次收发的字节数QTcpSocket*tcpsocket=newQTcpSocket(); //创建套接字对象connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(recvBytes())); //(b)intbytesrecved=0; //已接收的字节数TCP工作原理(2)建立连接及准备首先,由TCP客户端向服务器主动发起连接请求,使用语句:tcpsocket->connectToHost(地址,端口);这里的“端口”是TCP服务器上的监听端口。接受连接后,再由TCP服务器完成传输前的准备工作并启动传输,这个操作是在preTrans函数中进行的,以传输文件为例,代码如下://准备工作socket=tcpserver->nextPendingConnection();connect(socket,SIGNAL(bytesWritten()),this,SLOT(handleTrans()));localfile->open(QFile::OpenModeFlag::ReadOnly); //只读模式打开文件//启动传输block=localfile->read(payloadsize); //读取一个缓存块bytestobesend-=socket->write(block); //写入套接字TCP工作原理(3)TCP服务器发送数据在handleTrans函数中实现字节流的持续发送,代码为://进入TCP传输过程if(bytestobesend>0){if(bytestobesend>payloadsize){block=localfile->read(payloadsize); //每次读入一个缓存块}else{ //读取最后剩余的字节block=localfile->read(bytestobesend);}bytestobesend-=socket->write(block); //写入套接字}else{localfile->close(); //关闭文件socket->abort(); //释放套接字tcpserver->close(); //关闭TCP服务器}TCP工作原理(4)TCP客户端接收数据在TCP连接建立并启动传输后,客户端套接字就一直由readyRead信号所驱动而处于被动接收字节的状态,该信号关联的recvBytes函数实现对字节的接收和控制,代码为:if(bytesrecved<bytestotal){bytesrecved+=tcpsocket->bytesAvailable();block=tcpsocket->readAll(); //每次接收一个缓存块localfile->write(block);if(bytesrecved==bytestotal){localfile->close(); //关闭文件tcpsocket->abort(); //释放套接字bytesrecved=0; //复位...... //后续处理}}02TCP应用实例1.TCP服务器编程2.TCP客户端编程3.运行演示TCP应用实例【例】(难度中等)(CH1003)实现一个基于TCP的网络聊天室应用。1.TCP服务器编程以“直接编写代码”(即取消勾选“Generateform”复选框)方式创建Qt项目,项目名TcpServer,“ClassInformation”页基类选“QDialog”,类名命名为“TcpServer”。1)实现界面(1)在头文件tcpserver.h中声明需要的各种控件,代码如下:#include<QDialog>#include<QListWidget>#include<QLabel>#include<QLineEdit>#include<QPushButton>#include<QGridLayout>classTcpServer:publicQDialog{Q_OBJECTpublic:TcpServer(QWidget*parent=0,Qt::WindowFlagsf=0);~TcpServer();private:QListWidget*ContentListWidget;QLabel*PortLabel;QLineEdit*PortLineEdit;QPushButton*CreateBtn;QGridLayout*mainLayout;};TCP应用实例(2)在源文件tcpserver.cpp中布局程序界面,代码如下:#include"tcpserver.h"TcpServer::TcpServer(QWidget*parent,Qt::WindowFlagsf):QDialog(parent,f){setWindowTitle("TCPServer");ContentListWidget=newQListWidget;PortLabel=newQLabel("端口:");PortLineEdit=newQLineEdit;CreateBtn=newQPushButton("创建聊天室");mainLayout=newQGridLayout(this);mainLayout->addWidget(ContentListWidget,0,0,1,2);mainLayout->addWidget(PortLabel,1,0);mainLayout->addWidget(PortLineEdit,1,1);mainLayout->addWidget(CreateBtn,2,0,1,2);}TCP应用实例运行程序显示服务器界面如图。TCP应用实例2)完成聊天室服务器端功能(1)创建TCP套接字类在项目中添加C++类TcpClientSocket继承自QTcpSocket,作为套接字在服务器端实现与客户端程序的通信。套接字类头文件tcpclientsocket.h的代码为:#include<QTcpSocket>#include<QObject>classTcpClientSocket:publicQTcpSocket{Q_OBJECT//添加宏(Q_OBJECT)是为了实现信号与槽的通信public:TcpClientSocket(QObject*parent=0);signals:voidupdateClients(QString,int);voiddisconnected(int);protectedslots:voiddataReceived();voidslotDisconnected();};TCP应用实例在套接字类源文件tcpclientsocket.cpp的构造函数中关联信号与槽:#include"tcpclientsocket.h"TcpClientSocket::TcpClientSocket(QObject*parent){connect(this,SIGNAL(readyRead()),this,SLOT(dataReceived()));connect(this,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));}TCP应用实例其中,disconnected()信号在断开连接时发出。当有数据到来时,触发槽函数dataReceived(),代码如下:voidTcpClientSocket::dataReceived(){while(bytesAvailable()>0){intlength=bytesAvailable();charbuf[1024];read(buf,length);QStringmsg=buf;emitupdateClients(msg,length);}}该函数从套接字中将有效数据取出,然后发出updateClients()信号,此信号是通知服务器向聊天室内的所有成员广播消息。槽函数slotDisconnected()的代码为:voidTcpClientSocket::slotDisconnected(){emitdisconnected(this->socketDescriptor());}TCP应用实例(2)创建TCP服务器类在项目中添加C++类Server继承自QTcpServer,作为TCP服务器监听指定端口的TCP连接请求。服务器类头文件server.h的代码为:#include<QTcpServer>#include<QObject>#include"tcpclientsocket.h" //包含TCP套接字classServer:publicQTcpServer{Q_OBJECT //添加宏(Q_OBJECT)是为了实现信号与槽的通信public:Server(QObject*parent=0,intport=0);QList<TcpClientSocket*>tcpClientSocketList;signals:voidupdateServer(QString,int);publicslots:voidupdateClients(QString,int);voidslotDisconnected(int);protected:voidincomingConnection(intsocketDescriptor);};TCP应用实例在服务器类源文件server.cpp的构造函数中开启监听:#include"server.h"Server::Server(QObject*parent,intport):QTcpServer(parent){listen(QHostAddress::Any,port);}其中,参数QHostAddress::Any表示在指定的端口对任意地址进行监听。TCP应用实例(3)实现服务器函数当出现一个新的连接时,QTcpSever触发incomingConnection()函数,其参数socketDescriptor指定了连接的Socket描述符,该函数的代码如下:voidServer::incomingConnection(intsocketDescriptor){TcpClientSocket*tcpClientSocket=newTcpClientSocket(this); //(a)connect(tcpClientSocket,SIGNAL(updateClients(QString,int)),this,SLOT(updateClients(QString,int))); //(b)connect(tcpClientSocket,SIGNAL(disconnected(int)),this,SLOT(slotDisconnected(int))); //(c)tcpClientSocket->setSocketDescriptor(socketDescriptor); //(d)tcpClientSocketList.append(tcpClientSocket); //(e)}TCP应用实例槽函数updateClients()将任意客户端发来的消息进行广播,保证聊天室的所有成员均能看到其他人的发言,代码如下:voidServer::updateClients(QStringmsg,intlength){emitupdateServer(msg,length); //(a)for(inti=0;i<tcpClientSocketList.count();i++) //(b){QTcpSocket*item=tcpClientSocketList.at(i);if(item->write(msg.toLatin1(),length)!=length){continue;}}}TCP应用实例槽函数slotDisconnected()实现从tcpClientSocketList列表中将断开连接的TcpClientSocket对象删除的功能,代码如下:voidServer::slotDisconnected(intdescriptor){for(inti=0;i<tcpClientSocketList.count();i++){QTcpSocket*item=tcpClientSocketList.at(i);if(item->socketDescriptor()==descriptor){tcpClientSocketList.removeAt(i);return;}}return;}TCP应用实例(4)主程序创建TCP服务器在头文件tcpserver.h中添加如下内容:#include"server.h"private:intport;Server*server;publicslots:voidslotCreateServer();voidupdateServer(QString,int);在源文件tcpserver.cpp的构造函数中添加如下代码:port=8010;PortLineEdit->setText(QString::number(port));connect(CreateBtn,SIGNAL(clicked()),this,SLOT(slotCreateServer()));TCP应用实例其中,槽函数slotCreateServer()用于创建一个TCP服务器,代码如下:voidTcpServer::slotCreateServer(){server=newServer(this,port); //创建一个服务器对象connect(server,SIGNAL(updateServer(QString,int)),this,SLOT(updateServer(QString,int)));CreateBtn->setEnabled(false);}这里将服务器对象的updateServer信号与槽函数updateServer进行连接,该函数用于更新服务器上的信息显示,代码为:voidTcpServer::updateServer(QStringmsg,intlength){ContentListWidget->addItem(msg.left(length));}(5)最后,不要忘了在项目的配置文件TcpS中添加一句:QT+=networkTCP应用实例2.TCP客户端编程以“直接编写代码”(即取消勾选“Generateform”复选框)方式创建Qt项目,项目名TcpClient,“ClassInformation”页基类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学课题申报书 写字
- 高校省级课题申报书
- 员工合同范本表
- 师德建设课题申报书
- 企业员工租房合同范本
- 吉安农村生意转让合同范例
- 申报课题没申报书
- 医疗务工合同范本武威市
- 合伙人薪酬合同范本
- 不真实存在合同范本
- 2025年国航机务系统AMECO工程师岗位校园招聘笔试参考题库附带答案详解
- 《物联网中间件》课件
- 2025年中国建材集团所属中建材联合投资有限公司招聘笔试参考题库附带答案详解
- 水幕喷淋系统的工作原理与应用
- 门楼施工方案
- 全国职业院校技能大赛高职组(康复治疗技术赛项)考试及答案
- 2024年08月河北唐山银行第二批社会招考笔试历年参考题库附带答案详解
- 小学生拗九节课件
- 《智能制造技术基础》课件-第2章 智能系统方案与设计
- 人教版PEP小学五年级英语下册全册教案(含计划)
- 2025年幼儿园膳食工作计划
评论
0/150
提交评论