版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机网络课程设
计实验报告
文档仅供参考,不当之处,请联系改正。
中南大学课程设计报告
课程:计算机网络课程设计
题目:基于Winpcap的网络流量统计分析
指导教师:张伟
目录
第一章总体设计
一、实体类设计
文档仅供参考,不当之处,请联系改正。
P3
二、功能类设计
P3
三、界面设计
P3
第二章详细设计
一、实体类实现
P4
二、功能类实现
P4
三、界面实现
P5
第三章源代码清单及说明
一、CaptureUtil.java--------P7
二、MyPcapPacketHandler.java--------P9
三、PacketMatch.java--------P9
四、Windows.java--------P13
第四章运行结果-----P19
第五章心得体会-----P21
文档仅供参考,不当之处,请联系改正。
第一章总体设计
一'实体类设计
TCP、UPD、ICMP、ARP、广播数据包五个包的数据结构设
计
二、功能类设计
⑴网卡获取
⑵包的抓捕
⑶包的处理
三、界面设计
⑴布局
⑵按钮功能连接
文档仅供参考,不当之处,请联系改正。
第二章第二章详细设计
一、实体类实现
TCP、UPD、ICMP、ARP、广播数据包五个包的数据结构设
计。
本程序采用Java编写,基于winlOpcapoWinlOpcap是
winpcap在win1()系统上的适用版本。Java对于winpcap使用
jnetpcap进行支持。对于TCP、UPD、ICMP、ARP、广播数据包
五种类型的包,在jnetpcap的jar包中大部分已经封装好了相关的
实体类型。对应如下:
ARP实体类:work.Arp;
文档仅供参考,不当之处,请联系改正。
UPD实体类:work.Icmp;
IP实体类:work.Ip4;
TCP实体类:tocol.tcpip.Tcp;
UDP实体类:tocol.tcpip.Udp;
而对于其中的广播数据包,其判断我利用捕获到的IP包的目的
地址进行判断,若其目的地址为55,则认为其为广
播数据包。
二、功能类实现
(1)网卡获取
电脑上的包的发送与接受都得经过网卡来进行,因此为了完成
局域网数据包的捕获和统计,我首先要做的是获取到电脑上的网
卡列表,然后选择一个网卡进行包的捕获。而相关代码在jnetpcap
的官网的示例代码1中能够找到,从中能够学习到的是jnetpcap
的各种使用方法。
在我电脑上能够捕获到三个网卡,一个是本机自身的物理网
卡,另外两个是虚拟机模拟出的虚拟网卡。
选择网卡VMwareVirtualEthernetAdapter
VMwareVirtualEthernetAdapter
RealtekEthernetController
VMwareVirtualEthernetAdapter
⑵包的抓捕
Jnetpcap中包的抓捕也是有着固定的格式的,这在官网的示例
代码中也是能够找到的,只要设置好相关的参数,就能够进行抓
捕
文档仅供参考,不当之处,请联系改正。
具体方法如下,利用Pcap对象的loop方法。就是实例化一个
Pcap对象,然后调用其loop方法。第一个参数argO代表循环次
数,第二个参数就是传入一个PcapPaketHandler或其子类的对
象,这个对象类型是要由我们自己编写的对包处理的方法。
while(CaptureUtil.flag){
pcap.loop(lrmyhandler,"/njnetpcap");
}I|•<Object>intorg.jnetpcap.Pcap.loop(intargO,PcapPacketHandler<Object>argl.Objectarg2)
⑶包的处理
在这里对捕获的包的处理我是编写了一个PcapPacketHandler
的子类,然后重写了nextPacket()方法。在这个方法里我把捕获到
的包当作参数传递个具体的处理方法
packetMatch.handlePacket(packet)o
packetMatch.handlePacket(packet)方法是由我自己编写的。
handlePacket是packetMatch的一个静态方法,能够直接调用。在
这个方法里面,它会把捕获到的包的包头和TCP、UPD、ICMP、
ARP、广播数据包五种类型的包的包头进行一一比较,以确认是
否抓到了了相对应的包。
这儿还用到的就是jnetpcap的内部的一个方法,就是
packet.hasHeader(argO),经过在argO传入已在jnetpcap里封装好的
包的类型的实例,能够很好的判断该包是属于什么包类型的,是
TCP、UPD、ICMP、ARP还是广播数据包。
然后内部对于各种包的信息的输出也有很好的支持,能够直接
使用相应的toString方法,就能够输出各种相关信息。
(4)网络流量统计
文档仅供参考,不当之处,请联系改正。
对于各个捕获到的包,分别针对各种类型的包设计了一个
Double变量用于统计其传送过来相应包头的大小,并在停止抓包
后将统计的数据输出在最下方的TextArea里面。
二、界面实现
本程序在设计GUI时使用了Java的一个很好的插件
WindowBuildero
(1)布局
一开始使用BorderLayout布局,安排好各个按钮位置,文本
框位置。后来采用Absolutelayout,并将窗口大小固定化。
在布局的最上方是一个JToolBar的实例对象,其中放置有选择
网卡、开始抓包、停止抓包、清空记录等四个选项,中间是两个
带滚动条的多行文本框,左边的用于显示捕获的包的列表,右边
用于显示左边的我们选中的包的具体信息。最下方会在停止抓包
按钮生效后输出总的抓包情况。
如自叫二翼|回▼&<system*▼
<Palette
System_JA
年SelectionQMarquee
%Choosec...JUTabOrder
Containers
,JSplitPane,^JJTabbedP...
SJToolBar哈JlayeredP…
JDesktopP...i_JlnternalFr...
LayoutsI
储AbsoluteI...FlowLayout
亘iBorderLay...牯GridLayout
GridBagLa...CardLayout
HBoxLayoutjsSpringLay...
FormLayout特MigLayout
"GroupLay...
Struts&Springs
”Components
^iJLabelJJTextfield
^JComboBoxJButton
&JCheckBox<•JRadioBut...
J-JToggleBu...'.^JTextArea
!3?JFormatte...JPassword...v
⑵按钮功能连接
文档仅供参考,不当之处,请联系改正。
在布局的最上方是一个JToolBar的实例对象,其中放置有选择
网卡、开始抓包、停止抓包、清空记录等四个选项,其中选择网
卡的功能具体由JComboBox(多文本选择框)上的选项决定,这
个多文本选择框监听着网卡获取的方法,它会从该方法获得一个
网卡列表,然后将其文本输出。
开始抓包的方法所对应的事件是抓包的事件,而且该抓包事件
是个并发的进程。因为如果不将其设置为并发进程,其会使其它
事件一直阻塞,甚至连停止抓包都做不到。停止抓包的事件其实
是改变了开始抓包中的一个标志位,让其为假。该标志为为真,
抓包程序会一直进行,该标志为为假,抓包停止。
下方两个文本框,左边的文本框监听的是开始抓包这个事件,
当这个事件开始,这个事件会向文本框传输捕获到的包的列表,
然后让其显示。而右边的文本框监听的是左边文本框我们选中的
内容的相应事件。因为对于我们捕获到的包我进行了编号,当我
们在左边的文本框选中了一个包之后,左边的文本框对应的包的
序号会被右边的文本框获取,用于在一个列表中根据序号查找到
相对应的包的详细内容,然后将其输出。
统计功能的实现是在每个包的具体处理时,在处理包的方法类
中已经有定义好几个静态变量用于计数,每个包具体处理时,将
相对应的包类型数量加一即可。还定义了其它的变量用于统计流
量大小,也是在每个包具体处理时,将相对应的包的大小加到相
对应的静态变量上即可。
文档仅供参考,不当之处,请联系改正。
第三章源代码清单及说明
CaptureUtil.java
文档仅供参考,不当之处,请联系改正。
〃该类负责网卡列表的获取、包的捕获、抓包程序的停止
packageutil;
importjava.util.ArrayList;
importjavax.swing.JOptionPane;
importorg.jnetpcap.Pcap;
importorg.jnetpcap.PcapIf;
importentity.Windows;
publicclassCaptureUtilextendsThread{
privatestaticbooleanflag=true;
publicstaticintnumbet-2;
privatestaticStringBuildererrbuf=newStringBuilder();//
用于存储任何错误信息
〃此方法用于获取设备上的网卡设施
publicstaticArrayList<PcapIf>CaptureNet(){
CaptureUtil./Z6z^=false;
〃下面有部分代码来自jnetpcap官网的实例
ArrayList<PcapIf>alldevs=newArrayList<PcapIf>();//
用于存储搜索到的网卡
//取得设备列表
intr=Pcap.findAHDevs(aWdevs,errbuf);
文档仅供参考,不当之处,请联系改正。
if(r==Pcap.NQTOK||alldevs.isEmptyO){
JOptionPane.s〃ovvMessage£)ia/og(nun,e〃0/toString(),"错误
”,JOptionPane.£RROR_MESSAGE);
returnnull;
}
returnalldevs;
)
〃此方法用于选取网卡并捕获包
publicstaticvoidCapturePacket(ArrayList<PcapIf>alldevs){
CaptureUtil./7^=true;
Pcaplfdevice=andevs.get(〃",泌er);
/*System.out.printf("\nChoosing'%s'onyourbehalf:\n",device
.getDescription());*/
〃打开选中的设备
intsnaplen=Pcnp.DEFAULT_SNAPLEN;//默认长度为65535
intflags=Pcap.MODE_PROMISCUOUS;II混杂模式,扑获所
有类型的包
inttimeout=1()*1000;//1()secondsinmiHis
Pcappcap=Pcap.ope〃Live(device.getName(),snaplen,flags,
文档仅供参考,不当之处,请联系改正。
timeout,errbuf);
if(pcap==null){
”,JOptionPane.£RROR_MESSAGE);
return;
)
PacketMatchpacketMatch=PacketMatch.ge〃〃s/a〃ce();
MyPcapPacketHandler<Object>myhandler=new
MyPcapPacketHandler<Object>();
while(CaptureUtiiyZ<2g){
pcap.loop(l,myhandler,"/njnetpcap");
)
pcap.close();
)
publicvoidrun(){
CaptureUti\.CapturePacket(C^tureVti\.CaptureNetOy,
)
publicstaticvoidStopCapturePacket(){
文档仅供参考,不当之处,请联系改正。
CaptureUtiL/Zag=false;
}
publicstaticvoidClearPacket(){
PacketMatch.numherOfPacket=0;
PacketMatch..clear。;
Windows./〃e〃7s.clear();
PacketMatch.〃〃加Z?erQ加”p=0;
PacketMatch.〃“〃2〃erQ/7bp=O;
PacketMatch./?”〃仍erQ/L4=();
PacketMatch./?”〃仍erQ/7c〃w=();
P2LcketMatch.numherOfWideSpread=0;
}
}
MyPcapPacketHandler.java
//该类是PcapPacketHandler的子类,重写了nextPacket方法
packageutil;
importorg.jnetpcap.packet.PcapPacket;
importorg.jnetpcap.packet.PcapPacketHandler;
publicclassMyPcapPacketHandler<Object>implements
PcapPacketHandler<Object>{
文档仅供参考,不当之处,请联系改正。
@Override
publicvoidnextPacket(PcapPacketpacket,Objectargl){
PacketMatchpacketMatch=PacketMatch.ge〃九s/a〃ce();
packetMatch.handlePacket(packet);
PacketMatch.java
〃该类是包处理
packageutil;
importjava.util.HashMap;
importorg.jnetpcap.packet.PcapPacket;
importwork.Arp;
importwork.Icmp;
importwork.Ip4;
importtocol.tcpip.Tcp;
importtocol.tcpip.Udp;
importentity.Windows;
文档仅供参考,不当之处,请联系改正。
publicclassPacketMatch{
publicstaticHashMaphm=newHashMapO;
publicstaticintnumberOfPacket=0;
privatestaticPacketMatchpm;
privateIcmpicmp=newIcmp();
privateTcptcp=newTcp();
privateUdpudp=newUdp();
privateArparp=newArp();
privateIp4ip4=newIp4();
publicstaticdoubletotalOfIcmp=0;
publicstaticdoubletotalOfTcp=0;
publicstaticdoubletotalOfUdp=0;
publicstaticdoubletotalOfArp=0;
publicstaticdoubletotalOfSpread=0;
publicstaticdoubletota10flp=0;
publicstaticintnumberOfWideSpread=0;
publicstaticintnumberOfUdp=0;
publicstaticintnumberOfTcp=0;
publicstaticintnumberOflcmp=0;
publicstaticintnumberOfArp=0;
publicstaticPacketMatchgetlnstance(){
if(pm==null){
文档仅供参考,不当之处,请联系改正。
pm=newPacketMatch();
)
returnpm;
)
publicvoidhandlePacket(PcapPacketpacket){
〃以下四个包都已能够正确捕获
PacketMatch.totalOfIp+=packet.getTotalSize()/(1024.0*1024.
0);
if(packet.hasHeader(icmp)){
handlelcmp(packet);
)
if(packet.hasHeader(arp)){
handleArp(packet);
)
if(packet.hasHeader(tcp)){
handleTcp(packet);
)
if(packet.hasHeader(udp)){
handleUdp(packet);
)
〃广播数据包的捕获
文档仅供参考,不当之处,请联系改正。
if(packet.hasHeader(ip4)){
handlelp4(packet);
/*以下为实验IP地址的获取
packet.getHeader(ip4);
System.out.println(ip4.toString());
byte[]destinations=newbyte[4];
ip4.destinationToByteArray(destinations);
byte[]sources=newbyte[4];
ip4.sourceToByteArray(sources);
System.out.println("ip4destination:'1+destinations);
System.out.println(nip4resource:n+sources);
System.out.println(Hip4
destination:n+ip4.destinationToInt());
System.out.println(,,ip4
resource:H+ip4.sourceToInt());
System.out.println(Hip4
destination:,,+PacketMToIp(ip4.destinationToInt()));
System.out.println(nip4
resource:,,+PacketMToIp(ip4.sourceToInt()));
*/
)
文档仅供参考,不当之处,请联系改正。
)
privatevoidhandleIp4(PcapPacketpacket){
packet.getHeader(ip4);
if(PacketMToIp(ip4.destinationToInt()).equals('*255.2
55.255.255")){
〃这是一个广播数据包
System.out.println("收到一个广播数据包
”);
Windows.lItems.add(numberOfPacket,
播数据包”);
hm.put(numberOfPacket,"这是一个广播
数据包!”);
numberOfWideSpread++;
totalOfSpread+=ip4.getLength()/l024.0;
numberOfPacket++;
)
)
privatevoidhandleUdp(PcapPacketpacket){
packet.getHeader(udp);
System.out.printlnC'udp来源端口
文档仅供参考,不当之处,请联系改正。
n+udp.toString());
hm.put(numberOfPacket,udp.toStringO);
Windows.lItems.add(numberOfPacket,,,udpn);
numberOfUdp++;
totalOfUdp+=udp.getLength()/l024.0;
numberOfPacket++;
)
privatevoidhandleTcp(PcapPacketpacket){
packet.getHeader(tcp);
System.out.println(tcp.toStringO);
hm.put(numberOfPacket,tcp.toStringO);
Windows.lItems.add(numberOfPacket,"tcp");
numberOfTcp++;
totalOfTcp+=tcp.getLength()/1024.0;
numberOfPacket++;
}
privatevoidhandleIcmp(PcapPacketpacket){
packet.getHeader(icmp);
System.out.printlnC4cmpf^icmp.toStringO);
hm.put(numberOfPacket,icmp.toStringQ);
文档仅供参考,不当之处,请联系改正。
Windows.lItems.add(numberOfPacket,"icmp'*);
numberOfIcmp++;
totalOfIcmp+=icmp.getLength()/1024.0;
numberOfPacket++;
}
privatevoidhandleArp(PcapPacketpacket){
packet.getHeader(arp);
System.out.printlnC,arp:**+arp.toStringO);
hm.put(numberOfPacket,arp.toStringO);
Windows.lItems.add(numberOfPacket,"arpn);
numberOfArp++;
totalOfArp+=arp.getLength()/1024.0;
numberOfPacket++;
)
〃以下函数将Int类型转化为Ip地址
publicstaticStringintToIp(intiplnt){
returnnew
StringBuilder().append(((ipInt»24)&0xff)).append(,.,).append
((ipInt»16)&0xff).append(,.,).append
文档仅供参考,不当之处,请联系改正。
((ipInt»8)&0xff).append(,.*).append
((ipInt&Oxff)).toString();
)
)
Windows.java
//该类是GUI界面设计
packageentity;
importjava.awt.Color;
importjava.awt.EventQueue;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.ItemEvent;
importjava.awt.event.ItemListener;
importjava.util.ArrayList;
importjavax.swing.AbstractAction;
importjavax.swing.Action;
importjavax.swing.BorderFactory;
importjavax.swing.DefaultListModel;
importjavax.swing.JButton;
importjavax.swing.JComboBox;
importjavax.swing.JFrame;
文档仅供参考,不当之处,请联系改正。
importjavax.swing.JList;
importjavax.swing.JPanel;
importjavax.swing.JScrollPane;
importjavax.swing.JTextArea;
importjavax.swing.JToolBar;
importjavax.swing.border.Border;
importjavax.swing.border.EmptyBorder;
importjavax.swing.event.ListSelectionEvent;
importjavax.swing.event.ListSelectionListener;
importorg.jnetpcap.PcapIf;
importutil.CaptureUtil;
importutil.PacketMatch;
publicclassWindowsextendsJFrame{
privateJPanelcontentPane;
privatefinalActionaction=newSwingAction();
privateflnalActionaction_l=newSwingAction_l();
privatefinalActionaction_2=newSwingAction_2();
publicstaticDefaultListModellltems=new
文档仅供参考,不当之处,请联系改正。
DefaultListModelQ;
privateJListlist=newJList(lItems);
privatefinalActionaction_3=newSwingAction_3();
privateJScrollPanejspl=newJScrollPane(list);
privateJTextAreatextArea=newJTextArea();
privateJScrollPanejsp2=newJScrollPane(textArea);
privateJTextAreatextArea_l=newJTextArea();
/**
*Launchtheapplication.
*/
publicstaticvoidmain(String[]args){
EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
try(
Windowsframe=newWindows();
frame.setVisible(true);
}catch(Exceptione){
e.printStackTraceQ;
)
)
文档仅供参考,不当之处,请联系改正。
});
)
/**
*Createtheframe.
*/
publicWindows(){
setTitle(n\u6293\u5305");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100,100,692,477);
contentPane=newJPanel();
contentPane.setBorder(newEmptyBorder(5,5,5,5));
setContentPane(contentPane);
contentPane.setLayout(null);
this.setResizable(false);
JToolBartoolBar=newJToolBar();
toolBar.setBounds(5,5,666,23);
contentPane.add(toolBar);
JButtonbutton=new
JButton("\u9009\u62E9\u7F51\u536r,);
文档仅供参考,不当之处,请联系改正。
toolBar.add(button);
finalJComboBoxcomboBox=newJComboBox();
comboBox.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
String
net=(String)comboBox.getSelectedItem();
ArrayList<PcapIf>
alldevs=CaptureUtil.CaptureNet();
inti=0;
System.out.println(net);
for(Pcaplfdevice:alldevs){
if(net.equals(device.getDescription())){
CaptureUtil.number=i;
System.out.println(CaptureUtil.number+n:',+device.getDesc
ription());
CaptureUtil.StopCapturePacketO;
)
i++;
文档仅供参考,不当之处,请联系改正。
)
)
});
comboBox.addItemListener(newItemListener(){
publicvoiditemStateChanged(ItemEventargO){
)
));
toolBar.add(comboBox);
JButtonbutton_l=new
JButton(n\u5F00\u59CB\u6293\u5305n);
button_l.setAction(action_l);
toolBar.add(button_l);
JButtonbutton_2=newJButton("停止抓包”);
button_2.setAction(action_2);
button_2.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventargO){
)
));
toolBar.add(button_2);
文档仅供参考,不当之处,请联系改正。
JButtonbutton_3=new
JButtonC'\u6E05\u7A7A\u8BB0\u5F55n);
button_3.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
)
));
button_3.setAction(action_3);
toolBar.add(button_3);
Borderbrd=BorderFactory.createMatteBorder(1,1,2,
2,Color.black);
list.setBorder(brd);
list.addListSelectionListener(new
ListSelectionListener(){
publicvoidvalueChanged(ListSelectionEvent
argO){
//TODOAuto-generatedmethodstub
textArea.setText(',n);
textArea.append((String)PacketMatch.hm.get(list.getSelecte
dlndex()));
文档仅供参考,不当之处,请联系改正。
〃以下两行用于检测
//System.out.println(list.getSelectedIndex());
//
System.out.println((String)PacketMatch.hm.get(list.getSelect
edlndexQ));
)
));
jspl.setBounds(5,28,258,343);
contentPane.add(jspl);
jsp2.setBounds(263,28,408,343);
contentPane.add(jsp2);
textArea_l.setBounds(5,371,666,67);
contentPane.add(textArea_l);
ArrayList<PcapIf>alldevs=CaptureUtil.CaptureNet();
for(Pcaplfdevice:alldevs){
文档仅供参考,不当之处,请联系改正。
comboBox.addItem(device.getDescription());
)
)
privateclassSwingActionextendsAbstractAction{
publicSwingAction(){
putValue(NAME,“选择网卡”);
putValue(SHORT_DESCRIPTION,'Someshort
description'*);
)
publicvoidactionPerformed(ActionEvente){
ArrayList<PcapIf>
alldevs=CaptureUtil.CaptureNet();
if(alldevs!=null){
System.out.println('*Networkdeviceshasbeen
found:'*);
inti=1;
for(Pcaplfdevice:alldevs){
System.out.println(n第"+(i++)+”个网卡名
字:'*+device.getName()+'*\n信息:"+device
.getDescription());
文档仅供参考,不当之处,请联系改正。
)
)
)
)
privateclassSwingAction_lextendsAbstractAction{
publicSwingAction_l(){
putVahie(NAME,”开始抓包”);
putValue(SHORT_DESCRIPTION,'Someshort
description'*);
)
publicvoidactionPerformed(ActionEvente){
〃抓包线程
(newCaptureUtil()).start();
)
}
privateclassSwingAction_2extendsAbstractAction{
publicSwingAction_2(){
putVahie(NAME,"停止抓包”);
putValue(SHORT_DESCRIPTION,'Someshort
description");
)
publicvoidactionPerformed(ActionEvente){
文档仅供参考,不当之处,请联系改正。
CaptureUtil.StopCapturePacket();
textArea_l.setText('*n);
String
message=nTcp:"+PacketMatch.numberOfTcp+”包
,,+PacketMatch.totalOfTcp+',KB”+
"Udp:"+PacketMatch.numberOfUdp+'1包
n+PacketMatch.totalOfUdp+"KB,,+,,\n"+
,,Icmp:',+PacketMatch.numberOfIcmp+n包
n+PacketMatch.totalOfIcmp+“KB"+
,,Arp:,,+PacketMatch.numberOfArp+n包
,,+PacketMatch.totalOfArp+,,KB”+“\n"+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年航空公司飞机采购合同标的与性能要求
- 电桥法课程设计
- 2024年绿色建筑采光施工物业合同3篇
- 2024年企业培训课程评估与改进合同范本3篇
- 2024年度大米质量认证与品牌价值评估合同3篇
- 2024年版公寓食堂托管3篇
- 2024年生物科技研究合作与成果转化合同
- 情景化智能灯光课程设计
- 瑜伽场馆运营课程设计
- 现代诗课程设计
- 学历提升培训课件
- 唐山路北区2023-2024学年八年级上学期期末数学检测卷(含答案)
- 临床输血与检验课件
- 企业管理的决策与解决问题
- 国家开放大学2023年7月期末统一试《22691劳动关系与社会保障实务》试题及答案-开放专科
- 平潭港区进港航道及港池维护性疏浚工程环境影响报告
- 366天平和生活冥想手册
- 空灵鼓社团教学计划
- 真题解析1-2021年上海跨学科案例分析(茭白案例)
- 全国主要城市气象参数
- 宣城消防钢楼梯施工方案
评论
0/150
提交评论