小型Web服务器.doc_第1页
小型Web服务器.doc_第2页
小型Web服务器.doc_第3页
小型Web服务器.doc_第4页
小型Web服务器.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学 号: 0121110340631 课程设计报告题 目小型Web服务器 学 院计算机科学与技术 专 业计算机科学与技术 班 级计科zy1102 姓 名 何英企业指导老师 学校指导教师赖炜 胡纯彪戚欣2014年01月17日 系统软件开发实训B任务书学生姓名: 何英 专业班级: 计科zy1102 指导教师: 赖伟、胡纯彪 工作单位: 中软国际长沙ETC 指导教师: 工作单位: 计算机科学与技术学院 题 目: 小型web服务器 初始条件:理论:Windows操作系统、eclipse开发工具等环境,java开发语言实践:计算机科学系实验中心提供计算机及软件开发环境。要求完成的主要任务: 一、 目的定义总体要求,作为用户和软件开发人员之间相互了解的基础;提供性能要求、初步设计和对用户影响的信息,作为开发人员进行设计和实施的基础;作为总体验证和确认的依据。二、系统设计本系统是一个简单的客户端程序,并不需要数据库。系统采用Java语言开发,通过http协议实现下载功能。用户仅需通过在PC机上装上本系统,输入资源下载地址即可实现多线程下载。三、主要的功能模块的实现本产品包括四大功能模块,优先级定义可采用以下方法(QFD对功能需求的分类方法):高必须实现的功能,用户有明确的功能定义和要求;中应该实现的功能,用户的功能定义和要求可能是模糊的、不具体的、或低约束的,但是这类功能的缺少会导致用户的不满意,因此这类功能的具体需求应当由需求分析人员诱导用户产生并明确;低尽量实现的功能,并可根据开发进度进行取舍,但这类功能的实现将会增加用户的满意度。四、功能需求1、头、用户访问:用户通过浏览器访问服务器来获取所需要的网页信息2、服务器管理:记录用户的使用信息,以及对服务器上的页面、文件进行管理操作,并设置相应权限。时间安排:1、19周,周1-5, 计算机学院实验中心(一楼),项目需求分析的相关知识的讲解。2、20周周15,计算机学院实验中心(一楼),设计、答辨汇报设计成果、交课程设计报告、源程序(CD盘)。指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日 小型web服务器11. 开发环境11.1总体概述11.1.1. 项目描述11.1.2. 功能需求11.2. 所用的测试实例22. 任务分析23. 模块及接口说明33.1. 整体模块说明33.1.1. 系统总体框架结构图33.2. 个人模块说明33.2.1. 采用线程池实现多线程33.2.2. 采用实例池实现多线程54. 程序设计65. 运行结果分析86. 课程设计体会127. 本科生课程设计成绩评定表1313武汉理工大学小型Web服务器课程设计 小型web服务器1. 开发环境1.1总体概述1.1.1. 项目描述本项目使用的开发语言为java,主要涉及其网络编程方面,开发环境为eclipse平台,并使用JDK1.7开发包、Dreamweaver、及Microsoft Word。开发地点为余区计算机科学与技术实验中心一楼实验室。开发人员素质要求:熟悉java基本的语法并具有一定的编码能力。1.1.2. 功能需求本系统使用C/S模式,实现客户端从Web服务器读取网页。本系统支持文本信息、图像信息、音频信息等多种网页文件传输方法,实现用户交互的功能。本系统面向网页浏览的用户,具体功能如下表:序号功能名称功能需求标识优先级简要描述1浏览功能Glance over高提供访问者对网站基本功能和页面的浏览,包括切换、浏览、图片还原、试听 2统计功能Statistics中包括数量统计,访问人数统计 3注册功能Register低提供浏览者成为高级用户的功能 4数据管理Data manage中包括目录管理,信息发布,数据导入导出和数据清除 5系统管理System manage高包括权限管理和日志管理1.2. 所用的测试实例配置文件config: 测试网页、数据:2. 任务分析 由于服务器要满足及时响应的要求,因此必须实现我们采用多线程来处理每个请求。 我个人主要负责的就是多线程的实现,当大量请求同时访问服务器时,能够让用户感到得到及时的响应。 在本次课程设计中,我通过两种方法来实现并发执行:1) 通过线程池,采用ExecutorService的Executor.newCachedthreadPool()方法实现多线程并发执行。2) 通过实例池,采用Processors实例池的processor对象的后台线程实现多线程并发执行。3. 模块及接口说明3.1. 整体模块说明Connector ProcessorResponseRequest1n1111Connector ProcessorResponseRequest3.1.1. 系统总体框架结构图 浏览器请求浏览器请求浏览器请求多线程处理Request处理请求Response响应请求浏览器请求浏览器请求浏览器请求3.2. 个人模块说明3.2.1. 采用线程池实现多线程1)普通多线程:每接收到一个请求,创建一个线程为其服务;每次服务都对应进程的创建和销毁。有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。采用线程池可以实现线程复用,从而提高效率。 2)ThreadPool(线程池)的工作原理: 初始时线程池中创建了一些线程,当应用程序需要使用线程池中的线程进行工作,线程池将会分配一个线程,之后到来的请求,线程池都会尽量使用池中已有的这个线程进行响应,如果请求过多的话,线程池将会按照策略等待或者创建新的线程进行响应直到达到上限。当线程池中的线程处于空闲状态,一定时间后,线程池池内的空闲线程将会进行自我终结。 3)缓存线程池(Executors.newCachedThreadPool)的工作原理: 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。 对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。直接采用ExecutorService中Executor工厂方法 Executors.newCachedThreadPool()(无界线程池,可以进行自动线程回收)来实现多线程并发执行。具体实现如下: ExecutorService exec = Executors.newCachedThreadPool(); /创建一个线程池while(true) /开始循环监听try Socket socket = serverSocket.accept();exec.execute(new SingleUserThread(socket);/如果有用户请求,则开启一个线程来完成此请求catch(IOException e) e.printStackTrace(); 3.2.2. 采用实例池实现多线程1)线程池是可以优化的: 在线程池的工作中,服务器成功避免了重复创建和销毁线程;但是还有无效率的操作:它需要为每次请求创建一个Processor(处理类)的实例,这些类在每次执行完服务后都要被销毁。也就是说,在线程池中还存在这样大连格调着重复的创建和销毁操作,因此,效率还可以改进。2)优化的方法: 在线程池的基础上,创建一个Processor的实例池,从而避免每次创建Processor实例。重复利用Processor里的processor(Socket)方法为每次请求服务。在此基础上构建一个Processor实例池。 3)具体实现:4. 程序设计初始化HttpProcessor线程时,没法赋予所需的Socket对象,因为如果在初始化阶段就赋予Socket会导致此线程没法回收用来处理其他Socket。因此,在HttpProcessor的run阶段,先把线程给wait住,具体在await方法里体现,代码如下所示:private synchronized Socket await() / Wait for the Connector to provide a new Socket while (!available) try wait(); catch (InterruptedException e) /wait()被唤醒,await()返回一个Socket System.out.println(wait()被唤醒,await()返回一个Socket); / Notify the Connector that we have received this Socket Socket socket = this.socket; available = false; notifyAll(); return (socket); 当HttpConnector调用HttpProcessor.assign(socket)方法时,会给此线程赋予Socket对象,并唤起此线程,使其继续执行,assign方法的源码如下所示:synchronized void assign(Socket socket) / Wait for the Processor to get the previous Socket while (available) try wait(); catch (InterruptedException e) / Store the newly available Socket and notify our thread this.socket = socket; available = true; System.out.println(Assign:唤醒wait(); notifyAll(); if(!isRunning) isRunning = !isRunning; run(); 线程被唤起和赋予socket对象后,继续执行核心的process方法,HttpProcessor.run的完整源码如下所示:public void run()/process(socket);System.out.println(Run: Im working here.);while(!stoped)/等待下一个Socket被assign()方法调用Socket socket = await();System.out.println(Run:处理await()返回的 Socket);if(socket = null)continue;process(socket);try socket.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();System.out.println(Run: 关闭处理完毕的Socket);connector.recycle(this);synchronized(threadSync)threadSync.notifyAll();5. 运行结果分析小组最终成果展示:主页面:运行页面展示:访问地址:抗压测试结果:6. 课程设计体会 经过长达一周的培训以及四天的合作,我们小组最终完成了Web服务器的开发。这是我们第一次团队协作完成的一个课题,无论是对软件开发的宏观角度还是对微观角度的编码技巧和编码规范都有了一次全面的提升。 首先谈谈在本次实训项目中的不足,在多线程开发模块,对于线程池,因为有Java现成的类文件可以使用,可以通过他们很好的地对线程进行调控。虽然,针对线程池的效率问题上,我们提出了很好也很有作用的改善方法实例池。但是,受限于我们现在的知识水平,在对实例池的管理上还是非常不能令人满意的。在一开始,我们给程序设定了一个初始数量的线程数和运行的最大线程数,并给出策略:当线程够用时则充分利用实例池进行循环处理,而当服务器出现忙态时,就创建新的线程接收请求,直到达到最大线程数。但是,对于当服务器从忙态到闲态转换时,如何处理多余的实例,还没有给出很好的策略,这也是我们需要改进的方向所在。 对于这次实训,最多的还是知识的巨收获。从开始几天的实例讲解,到后面的分小组的项目实现,都是一个很好的历练过程。对于平时更多专注于理论学习的我们,这次实训对我们来说确实带来了非常多的收获。在讲课的过程中,清晰明了地向我们展示了在企业中一个软件产品的开发过程和开发模式,与我们学习过的理论知识相映射。此外,在培训的过程中,老师还向我们谈到了许多软件开发的细微之处,如命名的准则和一些预防出错的技巧。针对这次实训中的不足,实训完毕后,我还会继续努力去完善。感谢这次实训给我带来的收获,感谢各位老师!7. 本科生课程设计成绩评定表班级:计科ZY1102班姓名:曹睿学号:0121

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论