版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、滁州学院课程设计报告课程名称: 设计题目: 基于多线程的端口扫描程序 院 部: 计算机与信息工程学院 专 业: 网络工程 组 别: 第六组 起止日期: 2012年12月31日2013 年1月6日 指导教师: 计算机与信息工程学院二一二年制课程设计题目基于多线程的端口扫描程序组长学号班级院部计算机与信息工程专业网络工程组员指导教师课程设计目的锻炼Java高级编程的能力课程设计所需环境PC,Windows xp,JCretor Pro课程设计任务要求使用Socket实现简单的端口扫描功能。分别针对TCP和UDP,采用多线程技术实现端口扫描,给出扫描结果。课程设计工作进度计划序号起止日期工 作 内
2、容分工情况12012.12.312013.01.01分析题目,搜索相关资料。22013.01.012013.01.02整理相关资料,确定程序分工,布置任务。32013.01.022013.01.03编写程序代码。42013.01.042013.01.05调试改进程序。52013.01.052013.01.06编写课程设计报告与PPT指导教师签字: 年 月 日系(教研室)审核意见:系(教研室)主任签字: 年 月 日课程设计任务书目 录1需求分析11.1网络安全11.2课程背景11.3扫描器11.4多线程扫描器介绍21.4.1布局管理器21.4.2多线程21.4.3线程优先级31.4.4线程同步3
3、1.5端口扫描42概要设计42.1整体框架设计42.2流程图描述53详细设计63.1 端口扫描线程启动63.2 GUI图形界面73.3 按钮监听及异常处理94调试与操作说明114.1运行界面114.2扫描结果114.3错误提示125课程设计总结与体会136参考文献137致谢148附录1561需求分析1.1网络安全二十一世纪是信息化、网络化的世纪,信息是社会发展的重要资源。信息安全保障能力是一个国家综合国力、经济竞争实力和生存能力的重要组成部分,是世界各国在奋力攀登的制高点。网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常
4、地运行。网络安全包括技术领域和非技术领域两大部分:非技术领域包括一些制度、政策、管理、安全意识、实体安全等方面的内容;技术领域包括隐患扫描、防火墙、入侵检测、访问控制、虚拟专用网、CA认证、操作系统等方面的内容。这些技术的目标是保证信息的可控性、可用性、保密性、完整性、和不可抵赖性。端口扫描属于安全探测技术范畴,对应于网络攻击技术中的网络信息收集技术。1.2课程背景随着Internet的不断发展,信息技术已成为促进经济发展、社会进步的巨大推动力。端口扫描技术是网络安全扫描技术一个重要的网络安全技术。与防火墙、入侵检测系统互相配合,能够有效提高网络的安全性。安全扫描是安全技术领域中重要的一类。通
5、过扫描能自动检测远端或本地主机系统信息,包括主机的基本信息(如计算机名、域名、组名、操作系统型等)、服务信息、用户信息以及漏洞信息,它的重要性在于能够对网络进行安全评估,及时发现安全隐患,防患于未然。网络的安全状况取决于网络中最薄弱的环节,任何疏忽都有可能引入不安全的因素,最有效的方法是定期对网络系统进行安全分析,及时发现并修正存在的脆弱,保证系统安全。国外安全扫描技术的历史可以追溯到20世纪90年代,当时因特网刚刚起步,但是在过去的十年内,扫描技术飞速发展,迄今为止,其扫描技术已经非常完善,但是在全面性,隐蔽性和智能性上还有待提高。安全扫描从最初专门为UNIX系统而编写的一些只有简单功能的小
6、程序发展到现在,已经出现了可以运行多个操作系统平台上的,具有复杂功能的系统程序。国内的扫描技术是在国外的扫描器基础上发展起来的。其中有一些专门从事安全技术的公司。这些公司的扫描器以硬件为主,其特点是执行速度快,不像软件一样受到安装主机系统的限制。然而对于更多的基于主机的端口扫描而言,简单,实用,可靠才是它们的长处。1.3扫描器扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器你可以不留痕迹的发现远程服务器的各种TCP端口的分配。这就能让我们间接的或直观的了解到远程主机所存在的安全问题。为了保证网络中计算机的安全性,必须采取主动策略,快速、及时、准确、安全的检测出网络中计算机及防
7、火墙开放的和未开放的端口。计算机端口扫描技术就是这种主动防御策略实现的重要技术手段。扫描器采用模拟攻击的形式对目标可能存在的已知安全漏洞进行逐项检查。目标可以是工作站、服务器、交换机、数据库应用等各种对象。然后根据扫描结果向系统管理员提供周密可靠的安全性分析报告,为提高网络安全整体水平产生重要依据。在网络安全体系的建设中,安全扫描工具花费低、效果好、见效快、与网络的运行相对对立、安装运行简单,可以大规模减少安全管理员的手工劳动,有利于保持全网安全政策的统一和稳定。1.4多线程扫描器介绍1.4.1布局管理器在java中,组件放置在窗体上的方式是完全基于代码的。组件放置在窗体上的方式通常不是通过绝
8、对坐标控制,而是由“布局管理器”根据组件加入的顺序决定其位置。每个容器都有一个属于的自己布局管理器。使用不同的布局管理器,组件大小,位置和形状将大不相同。表格型布局管理器将容器划分成为一个多行多列的表格,表格的大小全部相同,是由其中最大的组件所决定。通过add方法可以将组件一一放在每个表格中。表格包型布局与表格型布局有些相近,但与表格型布局比较起来,表格包型更加灵活,更加复杂。通常表格包型布局,我们可以设定每个格子的大小,间隙等。1.4.2多线程每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段
9、,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。在计算机编程中,一个基本的概念就是同时对多个任务加以控制。许多程序设计问题都要求程序能够停下手头的工作
10、,改为处理其他一些问题,再返回主进程。可以通过多种途径达到这个目的。最开始的时候,那些掌握机器低级语言的程序员编写一些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。中断对那些实时性很强的任务来说是很有必要的。但对于其他许多问题,只要求将问题划分进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求。最开始,线程只是用于分配单个处理器的处理时间的一种工具。但假如操作系统本身支持多个处理器,那么每个线程都可分配给一个不同的处理器,真正进入“并行运算”状态。从程序设计语言的角度看,多线程操作最有价值的特性之
11、一就是程序员不必关心到底使用了多少个处理器。程序在逻辑意义上被分割为数个线程;假如机器本身安装了多个处理器,那么程序会运行得更快,毋需作出任何特殊的调校。根据前面的论述,大家可能感觉线程处理非常简单。但必须注意一个问题:共享资源!如果有多个线程同时运行,而且它们试图访问相同的资源,就会遇到一个问题。举个例子来说,两个线程不能将信息同时发送给一台打印机。为解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状态。所以一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为
12、了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。1.4.3线程优先级线程优先级被线程调度用来判定何时 哪个线程允许运行 。理论上,优先级高的线程比优先级低的线程获得更多的CPU时间。实际上,线程获得的CPU 时间通常由包括优先级在内的多个因素决定(例如,一个实行多任务处理的操作系统如何更有效的利用CPU时间) 。一个优先级高的线程自然比优先级低的线程优先。举例来说,当低优先级线程正在运行,而一个高优先级的线程被恢复(例如从沉睡中或等待I/O中),它将抢占低优先级线程所使用的CPU。理论上,等优先级线程有同等的权利使用CPU。但你必须小心了。记住, Java是被
13、设计成能在很多环境下工作的。一些环境下实现多任务处理从本质上与其他环境不同。为安全起见,等优先级线程偶尔也受控制。这保证了所有线程在无优先级的操作系统下都有机会运行。实际上,在无优先级的环境下,多数线程仍然有机会运行,因为很多线程不可避免的会遭遇阻塞,例如等待输入输出。遇到这种情形,阻塞的线程挂起,其他线程运行。但是如果你希望多线程执行的顺利的话,最好不要采用这种方法。同样 ,有些类型的任务是占CPU的。对于这些支配CPU类型的线程,有时你希望能够支配它们 ,以便使其他线程可以运行。1.4.4线程同步多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即
14、各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。同步的关键是管程,管程是一个互斥独占锁定的对象,在给定的时间,仅有一个线程获得管程,当一个线程需要锁定时,他必须进入管程。1.5端口扫描一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息。进行扫描的方法很多,可以是手工进行扫描,也可以用端口扫描软件进行。在手工进行扫描时,需要熟悉各种命令。对命令执行后的输出进行分析。用扫描软件进行扫描时,许多扫描器软件都有分析数据的功能。通过端口扫描,可以得到许多有用的信息,从而发现系统的安全漏洞。2概要设计2.1整体框架设计经过我们组员的思考很研究,得出了以
15、下几个模块的简单端口扫描器,整个端口扫描器的核心模块是是端口扫描系统,它由许多子模块组成,其结构如下图所示: TCP端口扫描程序基本信息检测模块参数设计模块端口扫描模块 检测信息匹配模块IP地址是否存在确定端口范围以及线程数通过scoket来进行端口扫描是否在参数范围中结果输出模块(通过GUI界面输出得到的结果)2.2流程图描述 开始输入主机名或要查找的的ip 输入端口的范围输入线程数匹配过滤原则是否完全匹配建立原始套接字连接读取应答内容应答数据有效 记录端口序列GUI界面中打印出来结 束3详细设计3.1 端口扫描线程启动扫描程序主要运用Socket编程。对于一个工作齐全的Socket,其工作
16、过程包含以下四个就基本步骤:创建通信双方的socket链接,即分别为服务器和客户端创建Socket对象,建立Socket连接;打开连接到Socket的输入流和输出流;按照一定的协议对Socket进行读/写操作;关闭连接。以下是程序代码/运行 扫描端口public void run()int i;Socket theTCPsocket;for(i=MIN_port+threadnum;iMAX_port;i+= Integer.parseInt(ThreadScan.maxThread.getText()ThreadScan.status.setText(扫描状态:正在扫描 +i+ 端口);tr
17、ytheTCPsocket=new Socket(hostAddress,i);theTCPsocket.close();ThreadScan.Result.append( +i);switch(i) case 21: ThreadScan.Result.append(FTP); break; case 23: ThreadScan.Result.append(TELNET); break; case 25: ThreadScan.Result.append(SMTP); break; case 80: ThreadScan.Result.append(HTTP); break; case 1
18、10: ThreadScan.Result.append(POP); break; case 139: ThreadScan.Result.append(netBIOS); break;ThreadScan.Result.append(,);catch (IOException e)if (i=MAX_port)ThreadScan.Result.append(n+扫描完成.);ThreadScan.status.setText(扫描状态:完成!);3.2 GUI图形界面图形用户界面是软件产品和用户交互的接口,是软件产品中用户直接可以看到并直接操作的部分。public class Thread
19、Scanpublic static JFrame main=new JFrame(基于JAVA的多线程TCP端口扫描程序);public static JTextArea Result=new JTextArea(,4,43);public static JTextField hostname=new JTextField(localhost,8);public static JTextField minPort=new JTextField(0,4);public static JTextField maxPort=new JTextField(1000,4);public static J
20、TextField maxThread=new JTextField(100,3);public static JDialog DLGError=new JDialog(main,错误!);public static Label DLGINFO=new Label();public static Label status=new Label(扫描状态:未开始);public static void main(String args)main.setSize(500,220);/main.setLocation(300,300);main.setResizable(false);DLGError
21、.setSize(300,100);DLGError.setLocation(400,400);JPanel mainPanel = new JPanel();Label H=new Label(ip或域名:);Label P1=new Label(端口范围:);Label P2=new Label();Label TNUM=new Label(线程数:);Label RST=new Label(扫描结果: );Label con=new Label( );Result.setLineWrap(true);Result.setEditable(false);JButton OK = new J
22、Button(确定);JButton Submit = new JButton(确定);JButton Cancel = new JButton(取消);Container mPanel = main.getContentPane();Container dPanel = DLGError.getContentPane();mPanel.setLayout(new FlowLayout(FlowLayout.LEFT);dPanel.setLayout(new FlowLayout(FlowLayout.CENTER);mPanel.add(H);mPanel.add(hostname);mP
23、anel.add(P1);mPanel.add(minPort);mPanel.add(P2);mPanel.add(maxPort);mPanel.add(TNUM);mPanel.add(maxThread);mPanel.add(RST);mPanel.add(Result);mPanel.add(con);mPanel.add(Submit);mPanel.add(Cancel);mPanel.add(status);dPanel.add(DLGINFO);dPanel.add(OK);main.setVisible(true);Submit.addActionListener(new
24、 SubmitAction();Cancel.addActionListener(new CancleAction();OK.addActionListener(new OKAction();3.3 按钮监听及异常处理本部分主要对各个按钮进行监听。是整个程序的时间驱动设计部分。并且显示运行结果。class SubmitAction implements ActionListenerpublic void actionPerformed (ActionEvent a)int minPort;int maxPort;int maxThread;tryminPort=Integer.parseInt
25、(ThreadScan.minPort.getText();maxPort=Integer.parseInt(ThreadScan.maxPort.getText();maxThread=Integer.parseInt(ThreadScan.maxThread.getText();catch(NumberFormatException e)ThreadScan.DLGINFO.setText(错误的端口号或线程数!端口号和线程数必须为整数!);ThreadScan.DLGError.setVisible(true);ThreadScan.status.setText(扫描状态:未开始);re
26、turn;try TCPThread.hostAddress=InetAddress.getByName(ThreadScan.hostname.getText();catch(UnknownHostException e)ThreadScan.DLGINFO.setText( 错误的IP地址/域名或地址不可达! );ThreadScan.DLGError.setVisible(true);ThreadScan.status.setText(扫描状态:未开始);return;if(minPort65535 | minPortmaxPort) ThreadScan.DLGINFO.setText
27、(最小端口必须是0-65535并且小于最大端口的整数!);ThreadScan.DLGError.setVisible(true);return;else TCPThread.MIN_port=minPort;if(maxPort65535 | maxPortminPort)ThreadScan.DLGINFO.setText(最大端口必须是0-65535并且大于最小端口的整数!);ThreadScan.DLGError.setVisible(true);ThreadScan.status.setText(扫描状态:未开始);return;else TCPThread.MAX_port=max
28、Port;if(maxThread200)ThreadScan.DLGINFO.setText( 线程数为1-200的整数! );ThreadScan.DLGError.setVisible(true);ThreadScan.status.setText(扫描状态:未开始);return;ThreadScan.Result.setText();ThreadScan.Result.append(正在扫描 +ThreadScan.hostname.getText()+ 线程数 +ThreadScan.maxThread.getText()+n);ThreadScan.Result.append(开
29、放端口: );for(int i=0;imaxThread;i+)new TCPThread(T + i,i).start();4调试与操作说明4.1运行界面对本机进行多线程的端口扫描,即在ip或域名中输入localhost 可对本机进行端口进行扫描,也可输入其他的ip地址或域名,可自行设置端口范围如从0到1000,最大不超过65535,可设置线程数范围为0200,扫描状态为未开始,点击确定即可运行程序。4.2扫描结果程序运行后,可以得到相关的端口扫描过程,其中扫描状态显示正在扫描的端口号,如下:程序运行结束后在扫描结果中显示扫描结束,并在扫描状态中显示完成。4.3错误提示程序中往往由于一些数
30、据不正确会造成运行后错误,所以在程序中添加了异常处理机制,其中遇到的错误可能有以下几种:当端口号或线程数不是整数时会出现如下错误:当ip地址或域名错误时,会出现如下错误:当最小端口数不在065535且不小于最大端口数时会出现如下错误:当最大端口数不在065535且不大于最小端口数时会出现如下错误:当线程数范围不在0200时会出现如下错误:5课程设计总结与体会本组成员共同设计的基于多线程的端口扫描程序基本满足了课程设计的要求,能够很好地对本机或其他电脑端口进行扫描,同时也处理了程序中可能出现的错误。本次课程设计,使我们对计算机网络这门课程有了更深入的理解。计算机网络是一门实践性较强的课程,为了学
31、好这门课程,必须在掌握理论知识的同时,加强上机实践。要想把课程设计做的更好,就要学会参考一定的资料,吸取别人的经验,加强团队合作。在本课程设计中,我们明白了理论与实际应用相结合的重要性,并提高了自己组织数据及编写大程序的能力。培养了基本的、良好的程序设计技能以及合作能力。这次课程设计同样提高了我们的综合运用所学知识的能力。课程设计程序的编写需要有耐心,有些事情看起来很复杂,但问题需要一点一点去解决,分析问题,把问题模块化,划分成小块以后就逐个去解决。再总体解决大的问题。这样做起来不仅有条理也使问题得到了轻松的解决。通过这段时间的课程设计,我们认识到计算机网络是一门比较难的课程。需要多花时间学习
32、。这次的课程设计培养了我们实际分析问题、编程和动手能力,使我们掌握了计算机网络课程设计的基本技能,提高了我们适应实际,运用于实际生活的能力。这次的课程设计提高了我们对于专业课的学习热情,使我们能够更加深入的理解课本内容,对计算机网络也有了进一步的理解和认识,同时也理解了将课本内容与实际生活相结合的好处。6参考文献1 赵生慧.Java面向对象程序设计.北京:中国水利水电出版社,2010。2 谢希仁.计算机网络(第五版).北京:电子工业出版社,2011。3 吴功宜.计算机网络(第二版).北京:清华大学出版社,2007。4 杨静宇. Java程序设计与应用开发(第2版) M. 北京: 清华大学出版社
33、, 2009。7致谢非常感谢老师耐心的指导,在实验过程中给出指导并给帮助分析思路,给我们提供了可行的方案设计思路,在实验过程中指出不足之处,为能够成功的完成课程设计做了很大的贡献;非常感谢各位组员的积极配合,一起分析题目,整理思路,努力思考解决方案,画出方案流程图,并进行了严密的算法分析,构造严谨的程序框架,然后各自完成自己负责的模块,最后一起整理出完整的程序,一起进行调试分析,评估程序的严谨性,找出不足。完善实验内容,整理资料,编写文档。8附录源代码:import .*;import java.io.*;/import java.util.*;import java.awt.*;import
34、 java.awt.event.*;import javax.swing.*;class TCPThread extends Threadpublic static InetAddress hostAddress;public static int MIN_port;public static int MAX_port;private int threadnum;public TCPThread(String name,int threadnum)super(name);this.threadnum = threadnum;public void run()int i;Socket theTC
35、Psocket;for (i = MIN_port+threadnum; i MAX_port; i += Integer.parseInt(ThreadScan.maxThread.getText()ThreadScan.status.setText(扫描状态:正在扫描 +i+ 端口);trytheTCPsocket=new Socket(hostAddress,i);theTCPsocket.close();ThreadScan.Result.append( +i);switch(i)case 21:ThreadScan.Result.append(FTP);break;case 23:T
36、hreadScan.Result.append(TELNET);break;case 25:ThreadScan.Result.append(SMTP);break;case 80:ThreadScan.Result.append(HTTP);break;case 110:ThreadScan.Result.append(POP);break;case 139:ThreadScan.Result.append(netBIOS);break;ThreadScan.Result.append(,);catch (IOException e)if (i=MAX_port)ThreadScan.Res
37、ult.append(n+扫描完成.);ThreadScan.status.setText(扫描状态:完成!);class CancleAction implements ActionListenerpublic void actionPerformed (ActionEvent e)System.exit(1);class SubmitAction implements ActionListenerpublic void actionPerformed (ActionEvent a)int minPort;int maxPort;int maxThread;tryminPort=Intege
38、r.parseInt(ThreadScan.minPort.getText();maxPort=Integer.parseInt(ThreadScan.maxPort.getText();maxThread=Integer.parseInt(ThreadScan.maxThread.getText();catch(NumberFormatException e)ThreadScan.DLGINFO.setText(错误的端口号或线程数!端口号和线程数必须为整数!);ThreadScan.DLGError.setVisible(true);ThreadScan.status.setText(扫描
39、状态:未开始);return;tryTCPThread.hostAddress=InetAddress.getByName(ThreadScan.hostname.getText();catch(UnknownHostException e)ThreadScan.DLGINFO.setText( 错误的IP地址/域名或地址不可达! );ThreadScan.DLGError.setVisible(true);ThreadScan.status.setText(扫描状态:未开始);return;if(minPort65535 | minPortmaxPort)ThreadScan.DLGINFO
40、.setText(最小端口必须是0-65535并且小于最大端口的整数!);ThreadScan.DLGError.setVisible(true);return;else TCPThread.MIN_port=minPort;if(maxPort65535 | maxPortminPort)ThreadScan.DLGINFO.setText(最大端口必须是0-65535并且大于最小端口的整数!);ThreadScan.DLGError.setVisible(true);ThreadScan.status.setText(扫描状态:未开始);return;else TCPThread.MAX_
41、port=maxPort;if(maxThread200)ThreadScan.DLGINFO.setText( 线程数为1-200的整数! );ThreadScan.DLGError.setVisible(true);ThreadScan.status.setText(扫描状态:未开始);return;ThreadScan.Result.setText();ThreadScan.Result.append(正在扫描 +ThreadScan.hostname.getText()+ 线程数 +ThreadScan.maxThread.getText()+n);ThreadScan.Result.
42、append(开放端口: );for(int i=0;imaxThread;i+)new TCPThread(T + i,i).start();class OKAction implements ActionListenerpublic void actionPerformed (ActionEvent e)ThreadScan.DLGError.dispose();public class ThreadScanpublic static JFrame main=new JFrame(基于JAVA的多线程TCP端口扫描程序);public static JTextArea Result=new JTextArea(,4,43);public static JTextField hostname=new JTextField(localhost,8);public static JTextField minP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 资料员年终个人工作总结参考8篇
- 七年级地理上册 4.2 气温和降水教学实录 (新版)粤教版
- 三年级信息技术上册 4 熟悉键位分布教学实录1 闽教版
- 2024-2025学年高中化学 第二单元 化学与资源开发利用 2.1 获取洁净的水教学实录1 新人教版选修2
- 陕西省神木县大保当初级中学九年级化学上册 6.2 二氧化碳制取的研究教学实录 新人教版
- 江西省九江市高中数学 第二章 概率 5 离散型随机变量的均值与方差(2)教学实录 北师大版选修2-3
- 物流运营方案
- 事业单位固定资产管理办法
- 房地产辞职报告
- 2023二年级数学上册 6 表内乘法(二)第5课时 解决问题配套教学实录 新人教版
- 【MOOC】轮滑高级教程-东北大学 中国大学慕课MOOC答案
- 2024年医院副院长工作总结范文(2篇)
- 【MOOC】诊断学-山东大学 中国大学慕课MOOC答案
- 周1530安全教育记录
- 建筑工程管理与实务二级建造师考试试卷及解答参考
- 中国非遗文化鱼灯介绍2
- 村集体经济入股分红协议书
- 人体寄生虫表格总结超全(原虫部分)
- 机械设备招投标授权委托书模板
- 科研年终总结汇报
- 汽车维修安全应急预案范文(5篇)
评论
0/150
提交评论