1、 学号: 0928524059基于 Mina 框架的 Java 通讯层应用学院名称: 软件学院 专业名称: 计算机科学与技术 年级班别: 2009 级 Java 班 姓 名: 指导教师: 教授 2013 年 05 月河南师范大学本科毕业论文河南师范大学本科毕业设计2基于 Mina 框架的 Java 通讯层应用摘 要 Apache Mina Server是一个网络通信应用框架,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA对象的序列化服务、虚拟机管道通信服务等) ,Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(M
2、ina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。随着网络通信的不断增加,用户对于服务器通讯层的要求也越来越高。如何提高服务器端程序的性能,如何使用一种高效的I/O底层,从而更容易地开发出高性能的网络应用程序,成为近年来通讯层研究的主要课题。通过对比,基于Mhm(Minimum hardware modificatio)框架的通讯层具有实现简单,性能高效的特点,是Java通讯层应用的推荐框架.关键词 Mina;Java; Mhm;IO ;NIO;Socket;ServerSocket; TCP/IP; IoAcceptor ;IoConnector; Buffer
3、edReader;Buffer;Charset;Channels;Selector;J2EE;MyEclipse;Enterprise ;JavaBeans; MinaServeBased on the the Mina Framework of Java Communication Layer ApplicationsAbstract Apache Mina Server is a network communication application framework, it is primarily a communication framework based on TCP / IP,
4、UDP / IP protocol stack (of course, also can provide Java object serialization, the virtual machine pipe communication services), Mina canhelp us to quickly develop high-performance, highly scalable network communications applications, Mina provides event-driven, asynchronous (asynchronous IO Minas
5、default is to use programming model the Java NIO as the underlying support) operation. With the continuous increase in network traffic, users are increasingly high requirements for the server communication layer. Therefore, how to improve the performance of the server-side program, how to use a high
6、ly efficient I / O low-level, making it easier to develop a high-performance network applications become the main topic of the communication layer in recent years. Mhm (Minimum hardware modification ) framework-based communication layer has a simple, efficient performance, by contrast, is the the Ja
7、va communication layer applications recommended framework.Keywords Mina;Java; Mhm;IO;NIO;Socket;ServerSocket ; TCP/IP; IoAcceptor ;IoConnector; BufferedReader;Buffer;Charset;Channels;Selector ;J2EE;MyEclipse ;Enterprise ;JavaBeans; MinaServe。河南师范大学本科毕业设计3目 录前 言 .31 运用 socket 实现通信的方式与关键技术 .31.1 通过 JA
8、VA 的 Socket 阻塞方式实现通信 .31.1.1 阻塞通信的服务器端 .41.1.2 阻塞通信的客户端 .41.2 通过 JAVA 的 Socket 非阻塞方式实现通信 .41.3 TCP/IP 协议 .41.3.1 Tcp、Ip 协议的特点 .41.3.2 Tcp/Ip 数据的传输过程 .41.3.3 端口号 .51.4 MINA 架构剖析 .52.nio 和 io 的区别和比较 .62.1 回顾 IO .62.2 NIO 的介绍和新 I/O.92.2.1 介绍 NIO .92.2.2 新 I/O .93.程序设计与编码 .103.1 开发平台与工具 .103.1.1 J2EE 平台
9、 .103.1.2 集成环境 .113.2 具体代码实现步骤 .113.2.1 下载使用的 Jar 包 .113.2.2 工程创建配置 .113.2.3.服务端程序 .123.2.4.客户端程序 .164.系统说明书 .184.1 开发环境及工具 .184.2 本聊天室包括服务器和客户端两个部分: .194.3 具体的使用说明如下: .19参考文献 .20致 谢 .21河南师范大学本科毕业设计4前 言自进入 21 世纪以来,网络发展异常迅速,电脑走进了普通人的家中,成了我们生活中不可缺少的一部分,随着用户的激增,网络通信的不断增加,用户对于服务器通讯层的要求也越来越高,给现在的服务器端的正常运
10、行带来了很大的压力。因此,如何提高服务器端程序的性能,如何使用一种高效的 I/O 底层,从而更容易地开发出高性能的网络通信程序,成为近年来通讯层研究的主要课题。本论文通过 JAVA 的 Socket 非阻塞方式实现了一个局域网的通信。目前 Java 构建的网络应用程序框架有多种,较为流行的框架有 Grizzly、Netty、QuickServer、xSocket、Mina 等,通过对比,基于 Mina 框架的通讯层具有实现简单,性能高效的特点1,是 Java 通讯层应用的推荐框架。1 运用 socket 实现通信的方式与关键技术1.1 通过 JAVA 的 Socket 非阻塞方式实现通信2非阻
11、塞式通讯是指可以将通信操作交给特定的通信硬件去完成,而无需等到其完全完成便可以返回。在该通信硬件进行通信操作时,处理机可以同步进行计算操作,实现了计算与通信的重叠,从而提高整个程序的执行效率。但缺点是不易实现。1.2 通过 JAVA 的 Socket 阻塞方式实现通信阻塞式通讯是指在每建立一个 Socket 连接的同时,创建一个新线程对该Socket 避行单独通信34。这种方式编码简单,实现容易,对一定数量的连接性能比较好。但是如果客户端上限很大的情况下,就不能得到及时的响应,且对系统资源是一种浪费。1.2.1 阻塞通信的服务器端服务器,使用 ServerSocket 监听指定的端口,端口可以
12、随意指定(由于 1024 以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于 1024的端口) ,等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。1.2.2 阻塞通信的客户端河南师范大学本科毕业设计5客户端,使用 socket 通信对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭 Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个 1024 以上的端口。1.3 TCP/IP 协议1.3.1 Tcp、Ip 协议的特点TCP/IP(Transmission Control Protocol/Inter
13、net Protocol)协议不是 TCP 和 IP这两个协议的合称,而是指因特网整个 TCP/IP 协议族。从协议分层模型方面来讲,TCP/IP 由四个层次组成:网络接口层、网络层、传输层、应用层5。图一: TCP/IP 四层协议的表示方法举例IP 协议的作用:第一,它是网络层的协议,提供互联网上数据传输的统一格式。第二,提供不可靠的无连接的服务。第三,定义了互联网上的传输数据的基本单元,提供了供路由选择的信息,没有差错校验和处理的机制。TCP 协议的功能:差错控制可靠性、面向连接、分段(Segment) 、端口号。TCP是传输控制协议,是面向连接的提供了一种可靠的传输服务,它用三次握手和滑
14、动窗口机制来保证传输的可靠性,及进行流量控制。1.3.2 Tcp/Ip 数据的传输过程当你把要传送的数据传递给 TCP 后,TCP 把这些信息分成很多个数据包(这种数据包称为 TCP 分组),每一个分组都包含有一个序号。接着 TCP 分组被传递给 IP 层,IP 层把这个 TCP 分组放在一个 IP 数据包的数据部分。然后,这个 IP 数据包被传到目的主机。目的主机上的 IP 层,把 IP 数据包的数据部分河南师范大学本科毕业设计6(即 TCP 分组)传递给 TCP 层。TCP 接收到分组后,检查数据包的正确性,如果不正确,通知源计算机重新送该 IP 包。利用分组的序号来将数据按照原来的顺序排
15、列,然后送给应用层。1.3.3 端口号逻辑意义上的端口,一般是指 TCP/IP 协议中的端口6,端口号的范围从 0 到65535,比如用于浏览网页服务的 80 端口,用于 FTP 服务的 21 端口等等。 服务器一般都是通过知名端口号来识别的。例如,对于每个 TCP/IP 实现来说,FTP服务器的 TCP 端口号都是 21,每个 Telnet 服务器的 TCP 端口号都是 23,每个 TFTP(简单文件传送协议)服务器的 UDP 端口号都是 69。任何 TCP/IP 实现所提供的服务都用知名的11023 之间的端口号。这些知名端口号由 Internet 号分配机构(Internet Assig
16、ned Numbers Authority,IANA)来管理。 1.4 MINA 架构剖析MINA (Multipurpose Infrastructure for Network Applications)是 Apache 软件组织开发的一种作为基于 NIO 的一个多功能网络应用程序框架,使用 Java 技术实现,可以帮助用户快速构建稳定、高性能的网络应用程序。该框架的主要特点有:基于 Java NIO设计。巧妙地采用松耦合架构;可灵活地加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能 采用回调的方式完成调用线程的使用更容易7。通过 Java 异步输入输出
17、(NIO)8技术,可以方便的支持 TCP/UDP 协议;灵活、可配置的线程模型,这对于网络通信程序来说尤其重要, 用户可以根据实际需要选择符合自身的线程模型;多编码方式支持,既可以使用字节流或者文本,也可以使用其它编码方式,如 ASN.1 编码等。MINA 框架的系统结构如图二 所示。河南师范大学本科毕业设计7图二:MINA 系统机构示意图MINA 框架主要由 I/O 服务管理 (IoService)、I/O 过滤器链(IoFilterChain)、I/O 处理器(IoHandler)和 I/O 会话管理(IoSession) 等模块组成。IoService 负责与远端客户进行通信底层操作,远
18、端发送的数据首先由 IoService 接收并转化为系统内部可识别的事件, 它的两个实现类 IoAcceptor 和 IoConnector 分别对应服务器端和客户端的 I/O 服务管理类; 然后,IoFilterChain 接收由 IoService 转化的事件,并使用链中包含的过滤器(IoFilter)进行处理,如日志记录、编码/解码、压缩和黑名单过滤等;最后,IoHandler 负责处理由过滤器链处理后的事件, 业务逻辑大多在本模块中实现。处理完后,由IoSession 负责与远端客户进行交互,即使用 IoSession 向远端发送的消息,该消息的发送顺序与接收的处理顺序刚好相反9(如图
19、二)。Mina 提供了时间驱动和异步操作的编程模型。当前发行的 Mhm 版本支持基于 Java NIO 技术的 TCPUDP 应用程序开发、串口通讯程序,且 Mina 所支持的功能也在进一步的扩展中。因此,在 Java 应用程序中使用 Mhm 框架可以不用考虑底层 I0 实现以及线程并发等复杂工作,使开发人员能够将更多的精力投入到业务逻辑和开发中,故被广泛采用10。2.nio 和 io 的区别和比较2.1 回顾 IO在介绍 NIO 之前,有必要了解传统的 I/O 操作的方式。以网络应用为例,传统方式需要监听一个 ServerSocket,接受请求的连接为其提供服务(服务通常包括了处理请求并发河
20、南师范大学本科毕业设计8送响应)图一是服务器的生命周期图,其中标有粗黑线条的部分表明会发生 I/O 阻塞。图三可以分析创建服务器的每个具体步骤。(1)首先创建 ServerSocketServerSocket server=new ServerSocket(10000) ;(2)然后接受新的连接请求 Socket newConnection=server.accept() ;对于 accept 方法的调用将造成阻塞,直到 ServerSocket 接受到一个连接请求为止。一旦连接请求被接受,服务器可以读客户 socket 中的请求。InputStream in = newConnection.
21、getInputStream();InputStreamReader reader = new InputStreamReader(in);BufferedReader buffer = new BufferedReader(reader);Request request = new Request();while(!request.isComplete() String line = buffer.readLine();request.addLine(line);这样的操作有两个问题,首先 BufferedReader 类的 readLine()方法在其缓冲区未满时会造成线程阻塞,只有一定数
22、据填满了缓冲区或者客户关闭了套接字,方法才会返回。其次,它回产生大量的垃圾,BufferedReader 创建了缓冲区来从客户套接字读入数河南师范大学本科毕业设计9据,但是同样创建了一些字符串存储这些数据。虽然 BufferedReader 内部提供了StringBuffer 处理这一问题,但是所有的 String 很快变成了垃圾需要回收。同样的问题在发送响应代码中也存在:Response response = request.generateResponse();OutputStream out = newConnection.getOutputStream();InputStream in
23、 = response.getInputStream();int ch;while(-1 != (ch = in.read() out.write(ch);newConnection.close();类似的,读写操作被阻塞而且向流中一次写入一个字符会造成效率低下,所以应该使用缓冲区,但是一旦使用缓冲,流又会产生更多的垃圾。传统的解决方法通常在 Java中处理阻塞 I/O 要用到线程(大量的线程(Thread)) 。一般是实现一个线程池用来处理请求,如图四:河南师范大学本科毕业设计10图四线程使得服务器可以处理多个连接,但是它们也同样引发了许多问题。每个线程拥有自己的栈空间并且占用一些 CPU
24、时间,耗费很大,而且很多时间是浪费在阻塞的 I/O操作上,没有有效的利用 CPU。2.2 NIO 的介绍和新 I/O2.2.1 介绍 NIOJava 具有安全性、简易性、健壮性以及平台无关性等特点,但用 Java 平台编写的 Socket 系统,在多客户端服务器模式下,易受到大置线程开销的影响,这样既导致了性能问题又缺乏可伸缩性。为解决这个问题,Java 平台的制订者引入了非阻塞 I/O 机制11。NIO 的非阻塞 I/O 机制的核心思想是多路复用,即将事物多路分离并分派到各自相应的事件处理程序中去它主要是围绕选择器和通道构建的12。由于NIO 的非阻塞 I/O 机制有效地解决了多线程服务器存
25、在的线程开销问题,同时又避免了轮询问题在性能上优于传统的阻塞式通讯,因此被广泛的大型的Java 应用程序所采用。NIO 包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的 I/O 类中的一些问题。Buffer:它是包含数据且用于读写的线形表结构。其中还提供了一个特殊类用于内存映射文件的 I/O 操作。Charset:它提供 Unicode 字符串影射到字节序列以及逆影射的操作。Channels:包含 socket,file 和 pipe 三种管道,它实际上是双向交流的通道。Selector:它将多元异步 I/O 操作集中到一个或多个线程中(它可以被看成是 Unix 中select()函数或 Win32 中 WaitForSingleEvent()函数的面向对象版本) 。2.2.2 新 I/O1)Buffer传统的 I/O 不断的浪费对象资源(通常是 String) 。新 I/O 通过使用 Buffer 读写数据避免了资源浪费。Buffer 对象是线性的,有序的数据集合,它根据其类别只包含唯一的数据类型。java.nio.Buffer 类描述 java.nio.ByteBuffer 包含字节类型。 可以从 ReadableByteChannel 中读在