河南师范大学计算机科学与技术专业本科毕业论文内容摘要:

s)是 Apache 软件组织开发的一种作为基于 NIO 的一个多功能网络应用程序框架 ,使用 Java 技术实现 ,可以帮助用户快速构建稳定、高性能的网络应用程序。 该框架的主要特点有 :基于 Java NIO 设计。 巧妙地采用松耦合架构;可灵活地加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高 运行于多处理器上的性能 采用回调的方式完成调用.线程的使用更容易[7]。 通过 Java 异步输入输出 (NIO)[8]技术 ,可以方便的支持 TCP/UDP 协议。 灵活、可配置的线程模型 ,这对于网络通信程序来说尤其重要 , 用户可以根据实际需要选择符合自身的线程模型。 多编码方式支持 ,既可以使用字节流或者文本 ,也可以使用其它编码方式 ,如 编码等。 MINA 框架的系统结构如图二 所示。 图二: MINA 系统机构示意图 河南师范大学本科毕业设计 7 MINA 框架主要由 I/O 服务管理 (IoService)、 I/O 过滤器链 (IoFilterChain)、 I/O 处理器 (IoHandler)和 I/O 会话管理 (IoSession)等模块组成。 IoService 负责与远端客户进行通信底层操作 ,远端发送的数据首先由 IoService 接收并转化为系统内部可识别的事件 , 它的两个实现类 IoAcceptor 和 IoConnector 分别对应服务器端和客户端的 I/O 服务管理类。 然后 ,IoFilterChain 接收由 IoService 转化的事件 ,并使用链中包含的过滤器(IoFilter)进行处理 ,如日志记录、编码 /解码、压缩和黑名单过滤等。 最 后 ,IoHandler 负责处理由过滤器链处理后的事件 , 业务逻辑大多在本模块中实现。 处理完后 ,由 IoSession 负责与远端客户进行交互 ,即使用 IoSession 向远端发送的消息 ,该消息的发送顺序与接收的处理顺序刚好相反 [9](如图二 )。 Mina 提供了时间驱动和异步操作的编程模型。 当前发行的 Mhm 版本支持基于 Java NIO技术的 TCP/ UDP 应用程序开发、串口通讯程序,且 Mina 所支持的功能也在进一步的扩展中。 因此,在 Java 应用程序中使用 Mhm 框架可以不用考虑底层 I/ 0 实现以及线程并发等复杂工作, 使开发人员能够将更多的精力投入到业务逻辑和开发中,故被广泛采用 [10]。 和 io 的区别和比较 回顾 IO 在介绍 NIO 之前,有必要了解传统的 I/O 操作的方式。 以网络应用为例,传统方式需要监听一个 ServerSocket,接受请求的连接为其提供服务(服务通常包括了处理请求并发送响应)图一是服务器的生命周期图,其中标有粗黑线条的部分表明会发生 I/O 阻塞。 图三 河南师范大学本科毕业设计 8 可以分析创建服务器的每个具体步骤。 ( 1)首先创建 ServerSocket ServerSocket server=new ServerSocket( 10000); ( 2)然后接受新的连接请求 Socket newConnection=(); 对于 accept 方法的调用将造成阻塞,直到 ServerSocket 接受到一个连接请求为止。 一旦连接请求被接受,服务器可以读客户 socket 中的请求。 InputStream in = ()。 InputStreamReader reader = new InputStreamReader(in)。 BufferedReader buffer = new BufferedReader(reader)。 Request request = new Request()。 while(!()) { String line = ()。 (line)。 } 这样的操作有两个问题,首先 BufferedReader 类的 readLine()方法在其缓冲区未满时会造成线程阻塞,只有一定数据填满了缓冲区或者客户关闭了套接字,方法才会返回。 其次,它回产生大量的垃圾, BufferedReader 创建了缓冲区来从客户套接字读入数据,但是同样创建了一些字符串存储这些数据。 虽然 BufferedReader 内部提供了 StringBuffer处理这一问题,但是所有的 String 很快变成了垃圾需要回收。 同样的问题在发送响应代码中也存在: Response response = ()。 OutputStream out = ()。 InputStream in = (); int ch; while(1 != (ch = ())) { (ch)。 } ()。 类似的,读写操作被阻塞而且向流中一次写入一个字符会造成效率低下,所以应该使河南师范大学本科毕业设计 9 用缓冲区,但是一旦使 用缓冲,流又会产生更多的垃圾。 传统的解决方法通常在 Java 中处理阻塞 I/O 要用到线程(大量的线程 (Thread))。 一般是实现一个线程池用来处理请求, 如图四: 图四 线程使得服务器可以处理多个连接,但是它们也同样引发了许多问题。 每个线程拥有自己的栈空间并且占用一些 CPU 时间,耗费很大,而且很多时间是浪费 在阻塞的 I/O 操作 上,没有有效的利用 CPU。 NIO 的介绍和新 I/O 介绍 NIO Java 具有安全性、简易性、健壮性以及平台无关性等特点,但用 Java 平台编 写的 Socket 系统,在多客户端/服务器模式下,易受到大置线程开销的影响,这 样既导致了性能问题又缺乏可伸缩性。 为解决这个问题, Java 平台的制订者引 入了非阻塞 I/O 机制 [11]。 NIO 的非阻塞 I/O 机制的核心思想是多路复用,即将事物多路分离并分派 到各自相应的事件处理程序中去.它主要是围绕选择器和通道构建的 [12]。 由于 NIO 的非阻塞 I/O 机制有效地解决了多线程服务器存在的线程开销问题,同时 又避免了轮询问题.在性能上优于传统的阻塞式通讯,因此被广泛的大型的 河南师范大学本科毕业设计 10 Java 应用程序所采用。 NIO 包( .*)引入了四个关键的抽象数据类型,它们共同解决传统的 I/O 类中的一些问题。 Buffer:它是包含数据且用于读写的线形表结构。 其中还提供了一个特殊类用于内存映射文件的 I/O 操作。 Charset:它提供 Unicode 字符串影射到字节序列以及逆影射的操作。 Channels:包含 socket, file 和 pipe 三种管道,它实际上是双向交流的通道。 Selector:它将多元异步 I/O 操作集中到一个或多个线程中(它可以被看成是 Unix 中select()函数或 Win32 中 WaitForSingleEvent()函数的面向对象版本)。 新 I/O 1) Buffer 传统的 I/O 不断的浪费对象资源(通常是 String)。 新 I/O 通过使用 Buffer 读写数据避免了资源浪费。 Buffer 对象是线性的,有序的数据集合,它根据其类别只包含唯一的数据类型。 类描述 包 含 字 节 类 型。 可 以 从 ReadableByteChannel 中读在 WritableByteChannel 中写 包含字节类型,直接在内存某一区域映射 包含字符类型,不能写入通道 包含 double 类型,不能写入通道 包含 float 类型 包含 int 类型 包含 long 类型 包含 short 类型 可以通过调用 allocate(int capacity)方法或者 allocateDirect(int capacity)方法 分 配 一 个 Buffer。 特 别 的 , 你 可 以 创 建 MappedBytesBuffer 通 过 调 用(int mode,long position,int size)。 直接( direct) buffer 在内存中分配一段连续的块并使用本地访问方法读 写数据。 非直接 (nondirect)buffer 通过使用Java 中的数组访问代码读写数据。 有时候必须使用非直接缓冲例如使用任何的 wrap 方法(如 (byte[]))在 Java 数组基础上创建 buffer。 2)字符编码 河南师范大学本科毕业设计 11 向 ByteBuffer 中存放数据涉及到两个问题:字节的顺序和字符转换。 ByteBuffer 内部通过 ByteOrder 类处理了字节顺序问题,但是并没有处理字符转换。 事实上, ByteBuffer没有提供方法读写 String。 处理了字符转换问题。 它通过构造 CharsetEncoder 和CharsetDecoder 将字符序列转换成字节和逆转换。 开发平台与工具 J2EE 平台 J2EE ,即是 Java2 平台企业版( Java 2 Platform Enterprise Edition),是原 Sun公司(现已被甲骨文公司收购)为企业级应用推出的标准平台 [13]。 它简化了企业解决方案的开发、部署和管理相关复杂问题的体系结构, J2EE 技术的基础就是核心 Java 平台或Java 2 平台的标准版,其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。