毕业设计论文-基于java的web服务器内容摘要:

HTTP/ 协议,支持 JAVA 中 Servlet、 JSP、 JDBC、 JNDI 等相关规范,能够部署大多数基于 Web 的 Java 应用。 DM WAS 由服务器核心类、 Java核心类库、第三方软件包、一组配置文件和多个 Web 应用程序组成。 服务器在启动时读入并解析服务器配置文件,并初始化一系列服务,包括类装载器、数据库连接池、 JNDI、数据源等资源在 JNDI 上的绑定、线程池、 Web应用程序的上下文等,最后建立 ServerSocket,等待客户端连接。 系统技术实现 Http 连接管理组件 一个客户机与一个服务器要进行有效的通信,他们之间必然要遵守某种共同的协议,当前,浏览器和 Web 服务器之间大多采用超文本传输协议 HTTP 进行通信。 HTTP 协议是基于 TCP/IP 协议之上的应用层协议,具有无连接、无状态、面向对象等几个特点。 HTTP 协议基于请求 /响应机制,其工作原理包括四个步骤。 :浏览器与服务器建立连接,打开一个称为套接字( socket)的虚拟文件,此文件的建立标志着连接建立成功。 :浏览器通过 socket 向服务器提交请求。 :服务器接收到该请求后,进行相应的事务处理,然后将处理结果通过 HTTP 传回给浏览器。 :当应答结束后,服务器断开与浏览器的连接,以保证更多的浏览器能够与服务器建立连接。 Http 连接管 理组件位于 DM WAS 的最前端,它在服务器启动过程中获取服务器配置参数并初始化,负责监听端口,接收请求消息,并且将处理后的回复反馈给客户端。 现 Http 连接管理组件基于 HTTP 协议,负责建立一个或多个服务器 Socket 并监听来自客户端的连接请求。 当某个客户端发出连接请求时,它建立一个 Socket对象,读出 Socket 输入输出流,将输入流进行解析并提取相关信息,然后实例化一个请求处理任务,并将输入输出流分别包装成 request 和 response 对象赋给该任务,交由线程池处理。 流程图如图 所示。 图 Http 连接管理组件流程图 Http 连接管理组件由 LifeCycle、 Server、 HttpServer、 ConnectionHandler、RequestHandler、 Request、 Response 等类和接口以及实现线程池的相关类组成。 下面详细介绍一下相关的数据结构。 interface LifeCycle void start throws LifeCycleException。 void stop throws LifeCycleException。 boolean isStarted。 LifeCycle 代表组件的生命周期接口,其目的是以一种一致的方式来管理组件的启动与停止。 服务器中所有具有生命周期的组件如服务器类、应用程序上下文类都必须实现该接口。 interface Server extends LifeCycle String getServerInfo。 String getServerName。 int getServerPort。 String getAppBase。 URLClassLoader getWebappParentClassLoader。 Server 代表整个服务器,它包含服务器的相关属性信息,负责服务器的启动与停止。 它由服务器启停组件调用。 HttpServer 类是对 Server 接口的实现,并扩展了对 Servlet 容器的接口。 class ConnectionHandler implements LifeCycle ServerSocket openSocket throws LifeCycleException。 void accept。 void handleConnection Socket socket throws IOException。 ConnectionHandler 实现了生命周期接口,它根据 Server 中的相关信息建立 ServerSocket,循环地接收客户端的连接请求。 它获取客户端的 Socket 连接对象,读取输入输出流,然后交给 RequestHandler 任务处理。 class RequestHandler implements LifeCycle,Task void parseRequest InputStream inputstream void execute Request request,Response response RequestHandler 同时实现了生命周期接口和 Task 接口,从而可以交给线程池处理。 RequestHandler 解析输入流,读取 HTTP 请求头,将输入输出流包装成Request 和 Response 对象,然后被 ConnectionHandler 放入线程池中,交由线程池执行。 interface Request extends void setResponse Response response。 void setSocketInputStream InputStream is。 void addCookie Cookie cookie。 void addHeader String headerName,String headerValue。 interface Response extends void setRequest Request request。 void setSocketOutputStream OutputStream os。 void writeHeaders throws IOException。 void flush throws IOException。 Request 和 Response 是对 Socket 输入输出流的包装并实现了相关的Servlet 接口,以一种对象的形式屏蔽了 HTTP 底层操作的细节。 Web 服务器应用程序常常要处理来自远程的大量而短小的任务,其特点是单个任务处理的时间很短而请求的数目却很大且很多请求是同时进行的。 显然单线程的处理机制无法满足我们的需求。 在服务器程序中,使用多线程是提高服务器性能的捷径。 实践证明,采用多线程设计可以极大地改善系统的响应性能,提高程序的并行性。 多线程,顾名思义就是在应用程序中使用多个线程。 在服务器应用程序中 使用多线程的意思是对于接收的每一个请求我们使用一个单独的线程进行处理。 构建多线程应用程序时,一个简单的方法是:每当一个请求到达时就创建一个新线程,然后在新建的这个线程中对该请求进行处理。 实际应用中,这种方法的缺点是很明显的:为每个请求创建一个新线程的开销是很大的;创建过多的线程可能会导致系统由于内存消耗过度而导致系统资源不足。 资源不足是多线程应用中需要注意的一个问题。 为了防止资源不足,服务器应对创建和销毁线程的次数进行合理的调整,尽量重用已有的线程。 池化技术被广泛的应用于服务器端软件的开发上。 池化技术简 单来说就是对已创建的对象放在一个池中进行缓存,将来需要某对象时,就从池中获取,从而达到重用对象的目的。 线程池技术是池化技术的一种,当需要完成某项任务时,直接从线程池中取出线程来对任务进行处理,任务处理完后,将线程返回线程池,其优点是:任务到达时,由于不需要新建线程,而是直接使用已有线程,提高了应用程序的响应速度。 而且,通过适当地调整线程池中的最大线程数目和最小线程数目,可以防止系统资源不足问题。 .1 实现 在 DM WAS 中我们使用了多线程机制,对于单个的请求都交给线程池模块进行处理。 我们使用事件驱动处理的方 法实现线程之间的调度。 在事件驱动处理的情况下,需要一种发信机制来控制某一特定线程何时应该运行。 在 Java 中,可以使用 wait 、 notify 和 notifyAll 方法向线程发送信号。 这些方法允许线程在一个对象上阻塞,直到所需的条件得到满足为止,然后再次开始运行。 这种设计减少了 CPU 占用,因为线程在阻塞时不消耗执行时间,并且可在 notify 方法被调用时立即唤醒。 与其它方法相比,事件驱动方法可以提供更短的响应时间。 线程池模块包括线程池、工作线程、任务队列、任务接口等几个部分。 class ThreadPool implements LifeCycle void initPool。 //初始化线程池 void createWorker。 //创建工作线程 void execute Task task。 //执行指定任务 /*将工作线程返回到池中 */ void returnWorker WorkerThread worker。 /*通知线程池该任务发生异常,从而线程池可以结束该任务并回收该任务所占用的工作线程 */ void errorOccur Task task。 ThreadPool 代表线 程池,其作用是创建、销毁并管理线程,将工作线程放入线程池中,调用工作线程执行任务,销毁异常任务。 class WorkerThread implements Runnable void run。 //运行工作线程 boolean overtime。 //线程是否超时 WorkerThread 代表一个工作线程,它是一个独立的可以循环执行任务的线程对象,在没有任务时进行等待 wait ,在任务到达时被唤醒 notify 执行。 class TaskQueue void pushTask Task task。 //将任务放入任务队列的队尾 Task popTask。 //从任务队列的队头取出任务执 //行并从队列中删除该任务 void RemoveTask Task task。 //从任务队列中移走任务 TaskQueue 代表一个任务队列,其作用是提供一种缓冲机制,将没有处理的任务放在任务队列中,等到有工作线程可用时依次执行队列中的任务。 interface Task void start。 //任务开始执行 void reject。 //丢弃该任务 Task 是一个接口,它是每个任务必须实 现的接口,线程池只执行实现了该接口的类,它提供一组方法用来规定执行任务的入口、任务的执行状态、任务执行完后的收尾工作等,从而保证线程逻辑和应用逻辑的分离,工作线程通过该接口调度任务的执行。 .2 流程图 线程池处理任务的过程如图 所示。 .3 存在的问题 线程池为我们构建多线程的服务器应用程序提供了强大的机制,但使用它可能会出现一些问题。 这里的资源包括线程自身所使用的资源、线程处理任务时可能需要的其它资源,例如数据库连接、 Socket 套接字或文件输入输出流等。 资源不足问题的本质原因就是过 多创建线程从而消耗包括内存和其它系统资源在内的大量资源。 为解决资源不足问题,我们在线程池中提供了几个参数供用户根据实际情况优化线程池。 1 Threads:线程池中最大线程数,默认为无限大。 通常我们期望 Threads 应该是服务器能够接受的最大并发访问数。 如果有多于 Threads 的并发请求,多余的请求将被任务队列进行缓存。 图 线程池处理任务的流程图 2 minTreads:线程池中最小线程数,默认为 1。 服务器启动时,会初始。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。