- 浏览: 762391 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
erpaoshouling:
赞,多谢作者整理
Maven Assembly插件介绍 -
zxjlwt:
学习了。http://surenpi.com
maven-jar-plugin 特殊用法 -
strive708:
很有用的东西,一直在找,终于找到了。感谢
hibernate4调用存储过程 -
di1984HIT:
哈哈,学习了。
突然断电oracle故障 -
di1984HIT:
不错,真的很好。
Oracle 横表和纵表
Mina使用起来多么简洁方便呀,就是不具备Java NIO的基础,只要了解了Mina常用的API,就可以灵活使用并完成应用开发。首先,看Mina在项目中所处的位置,如下图:
Mina处于中间层,它不关心底层网络数据如何传输,只负责接收底层数据,过滤并转换为Java对象提供给我们的应用程序,然后把应用程序响应值过滤并转换为底层识别的字节,提供给底层传输;
------总之:Mina是底层数据传输和用户应用程序交互的接口!
这个流程图不仅很直观的看出了Mina的工作流程,也涵盖了Mina的三个核心接口:IoService接口,IoFilter接口和IoHandler接口:
第一步. 创建服务对象(客户端或服务端) ---IoService接口实现
第二步. 数据过滤(编码解码等) ---IOFilter接口实现
第三步. 业务处理 ---IoHandler接口实现
Mina的精髓是IOFilter,它可以进行日志记录,信息过滤,编码解码等操作,把数据接收发送从业务层独立出来。
创建服务对象,则是把NIO繁琐的部分进行封装,提供简洁的接口。
业务处理是我们最关心的部分,跟普通的应用程序没任何分别。
作用:IoService是创建服务的顶层接口,无论客户端还是服务端,都是从它继承实现的。
常用接口为:IoService,IoAcceptor,IoConnector
常用类为:NioSocketAcceptor,NioSocketConnector
类图如下:
先提出两个问题:
- 为什么有了IoService接口还要定义AbstractIoService抽象类?
- AbstractIoService抽象类与IoAcceptor(IoConnector)有什么区别?
分析:
- IoService接口声明了服务端的共有属性和行为;
- IoAcceptor接口继承了IoService接口,并添加了服务端特有的接口属性及方法,比如bind()方法,成为典型的服务端接口;
- IoConnector接口同样继承了IoService接口,并添加了客户端特有的接口属性及方法,比如connect()方法,成为典型的客户端接口;
---- IoService是IoAcceptor和IoConnector父接口,为什么不直接定义IoAcceptor和IoConnector接口呢,因为 它们有共同的特点,比如共同属性,管理服务的方法等,所有IoService的出现是为了代码复用。
- AbstractIoService实现了IoService中管理服务的方法,比如getFilterChainBuilder方法---获得过滤器链;
----为什么有了IoService接口还要定义AbstractIoService抽象类?一样为了代码的复用!AbstractIoService抽象类实现了服务端或客户端的共有的管理服务的方法,不需要让IoService接口的子类重复的实现这些方法;
- AbstractIoService抽象类继承了AbstractIoService抽象类并实现了IoAcceptor接口,成为了拥有管理服务端实现功能的服务端类;我们常用的NioSocketAcceptor就是它的子类;
- AbstractIoConnector抽象类继承了AbstractIoService抽象类并实现了IoConnector接口,成为了拥有管理客户端实现功能的客户端类;我们常用的NioSocketConnector就是它的子类;
----AbstractIoService抽象类与IoAcceptor(IoConnector)有什么区别?很清楚,AbstractIoService抽象类实现 的是共有的管理服务的方法,只有管理功能的一个类;而两个接口却是不同的两个服务角色----一个客户端,一个服 务端。
IoFilter接口
Mina最主要的工作就是把底层传输的字节码转换为Java对象,提供给应用程序;或者把应用程序返回的结果转换为字节码,交给底层传输。这些都是由IoFilter完成的,因此IoFilter是Mina的精髓所在。
在Mina程序中,IoFilter是必不可少的;有了它,Mina的层次结构才异常清晰:
IoFilter ---- 消息过滤
IoHandler ---- 业务处理
Filter,过滤器的意思。IoFilter,I/O操作的过滤器。IoFilter和Servlet中的过滤器一样,主要用于拦截和过滤网络传输中I/O操作的各种消息。在Mina 的官方文档中已经提到了IoFilter 的作用:
(1)记录事件的日志(Mina默认提供了LoggingFilter)
(2)测量系统性能
(3)信息验证
(4)过载控制
(5)信息的转换(主要就是编码和解码)
(6)和其他更多的信息
IoService实例会绑定一个DefaultIoFilterChainBuilder ---- 过滤器链,我们把自定义的各种过滤器(IoFilter)自由的插放在这个过滤器链上了,类似于一种可插拔的功能!
常用接口为:IoFilter,IoFilterChainBuilder
常用类为:IoFilterAdapter,DefaultIoFilterChainBuilder
ProtocolCodecFilter,LoggingFilter
类图如下:
同上面,先提出两个问题:
1. 在IoService中如何添加多个IoFilter?
2. 如何自定义协议编解码器?
分析:
a. IoFilter有2个实现类:IoFilterAdapter是个抽象的适配器类,我们可以根据需要扩展这个类,并且有选择的覆盖过滤器的方法;所有方法的默认把事件转发到下一个过滤器;查看源码如下:
public void sessionOpened(NextFilter nextFilter, IoSession session)throws Exception {
nextFilter.sessionOpened(session);
}
b .ReferenceCountingFilter封装了IoFilter实例,监看调用该filter的对象的个数,如果没有任何对象调用该IoFilter,就自动销毁IoFilter;查看源码如下:
public class ReferenceCountingFilter implements IoFilter {
private final IoFilter filter;
private int count = 0;
public ReferenceCountingFilter(IoFilter filter) {
this.filter = filter;
}
public void init() throws Exception {
// no-op, will init on-demand in pre-add if count == 0
}
public void destroy() throws Exception {
} ……………略
c. 实现IoFilterAdapter的类有多个,但是我们使用最多的就是
ProtocolCodecFilter----它是我们自定义编解码器的入口。
IoHandler是Mina实现其业务逻辑的顶级接口;它相当简单,你就理解它是根据事件触发的简单应用程序即可。
在IoHandler中定义了7个方法,根据I/O事件来触发对应的方法:
import java.io.IOException; public interface IoHandler { void sessionCreated(IoSession session) throws Exception; void sessionOpened(IoSession session) throws Exception; void sessionClosed(IoSession session) throws Exception; void sessionIdle(IoSession session, IdleStatus status) throws Exception; void exceptionCaught(IoSession session, Throwable cause) throws Exception; void messageReceived(IoSession session, Object message) throws Exception; void messageSent(IoSession session, Object message) throws Exception; }
sessionCreated:当一个新的连接建立时,由I/O processor thread调用;
sessionOpened:当连接打开是调用;
messageReceived:当接收了一个消息时调用;
messageSent:当一个消息被(IoSession#write)发送出去后调用;
sessionIdle:当连接进入空闲状态时调用;
sessionClosed:当连接关闭时调用;
exceptionCaught:当实现IoHandler的类抛出异常时调用;
一般情况下,我们最关心的只有messageReceived方法,接收消息并处理,然后调用IoSession的write方法发送出消息!(注意:这里接收到的消息都是Java对象,在IoFilter中所有二进制数据都被解码啦!)
一般情况下很少有人实现IoHandler接口,而是继承它的一个实现类IoHandlerAdapter,这样不用覆盖它的7个方法,只需要根据具体需求覆盖其中的几个方法就可以!
Iohandler的7个方法其实是根据session的4个状态值间变化来调用的:
l Connected:会话被创建并使用;
l Idle:会话在一段时间(可配置)内没有任何请求到达,进入空闲状态;
l Closing:会话将被关闭(剩余message将被强制flush);
l Closed:会话被关闭;
状态转换图如下:
发表评论
-
enum使用一例
2013-08-15 17:59 1210/** * User: renjunjie * ... -
JVM Crash 学习分析
2013-07-28 17:17 1426遇到如下错误 # # A fatal error h ... -
java原样输出特殊符号
2012-08-21 17:07 6802String str1 = "test\test\t ... -
servlet request和response的模拟单元测试
2012-08-01 15:39 6804项目采用分层开发,服务端和客户端。服务端的开发需要测试,但是涉 ... -
Maven命令行来创建项目
2012-07-28 23:29 16901)创建简单maven项目 mv ... -
Import Maven Project to Eclipse and Fix the errors
2012-07-28 22:55 1671使用mvn创建java项目eclipse导入报错 Mu ... -
阿里分布式框架dubbo学习
2012-07-24 15:28 2899简单测试例子,附件 参考官方文档 http://co ... -
java系统间通信(分布式调用)
2012-07-24 10:27 2315具体见附件的例子 1、使用共享内存实现MappedBy ... -
java中的多线程总结
2012-07-23 22:20 3721多线程目录 <!--[if !supp ... -
idea生成错误
2012-07-04 21:47 1196自己打的jar包,idea引用。 第二次打的包和第一次的 ... -
如何在 64 位 linux 机器上安装 jdk1.6?
2012-07-03 10:32 3313也可以参考上篇博客《在Linux系统环境下安装配置JDK常用方 ... -
javaWeb产品项目license的开发使用
2012-03-24 15:51 12169公司开发的一个产品,提供给客户使用,要有试用的时间限制和购买的 ... -
Maven使用第三方jar文件的两种方法
2012-03-03 17:38 2011在Maven中,使用第三方库一般是通过po ... -
jquery向struts2传值的几种方式
2011-08-15 16:14 3655从web页面向服务器传送数据,传统的方式有 1、直接在url ... -
classpath 载入多个jar
2011-07-27 14:46 4656早上启动red5启动不了,也没有报什么错误,修改red5.ba ... -
How-to recover from checksum mismatch errors in SVN
2011-03-14 17:11 1498How-to recover from checksum mi ... -
Maven奇怪的错误,invalid LOC header
2010-12-28 15:20 6180今天试着整合spring3+jsf2,使用maven进行依赖管 ... -
unsupported major.minor version 解决方法
2010-04-06 17:12 1426一直以 ... -
事件不执行,也不报错
2010-03-08 10:00 1297在ftl里面的如下语句,双击事件既不执行,也不报错 & ... -
五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
2010-02-21 13:57 1152当Adobe、Microsof ...
相关推荐
《MINA学习总结》 MINA(全称:Java Multicast Network Application Framework)是一个由Apache软件基金会开发的网络应用框架,主要用于构建高性能、高可用性的网络服务器。它为开发者提供了异步I/O处理的能力,...
总结来说,NIO 和 MINA 为Java网络编程提供了更高效、更灵活的解决方案。相比于传统的阻塞式socket,NIO降低了系统资源的消耗,MINA则进一步简化了NIO的使用,使得开发者能更专注于应用的业务逻辑。对于需要处理大量...
MINA开发文档总结,有如下内容Apache_Mina_Server_2.0中文参考手册V1.0.pdf 深入理解Apache_Mina.pdf MINA2官方教程翻译.pdf Mina2源码分析.pdf
《Mina学习资料》 Apache Mina是一个高度可扩展的网络通信框架,它为开发者提供了构建高性能、高可用性的网络应用程序的基础。Mina的核心理念是将网络通信的复杂性抽象出来,让开发者能够专注于业务逻辑,而不是...
Apache Mina是一个基于Java的网络通信框架,专为高性能、高可用性和可扩展性而设计。...在深入学习Mina的过程中,理解IoService及其子类的工作原理,以及如何结合IoHandler实现业务逻辑,对于掌握Mina框架至关重要。
1. **下载使用的Jar包**:在开始Mina2.0的学习之前,你需要从Apache官网或其他可靠的源下载Mina的最新版本库。通常,这包括核心库和其他依赖库,如slf4j用于日志记录。 2. **工程创建配置**:创建一个新的Java项目...
这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...
总结起来,"mina学习基础-入门实例-传输定长报文(三)"主要涵盖了如何使用Apache Mina框架实现定长报文的SSL加密传输。这个过程涉及到了Mina的Server创建、过滤器链构建、编码解码器设计以及事件驱动模型的运用。通过...
在本学习笔记中,我们将专注于MINA的子项目——FtpServer,它是实现FTP服务器功能的一个模块。 FTP(File Transfer Protocol)是一种广泛使用的互联网协议,用于在不同主机之间传输文件。Apache MINA FtpServer提供...
总结** Apache Mina2.0为开发者提供了强大的工具,简化了网络编程的复杂性,使得开发高性能的网络应用变得更加容易。通过深入理解和熟练运用Mina的API和设计模式,开发者可以构建出高效、稳定的网络服务。
总结来说,这个压缩包提供了全面的MINA开发资源,包括必要的库文件和详细的文档,对于想要学习和使用MINA进行网络应用开发的人员来说非常有价值。通过深入阅读手册,理解和实践提供的示例,开发者可以快速掌握MINA的...
总结起来,Apache Mina提供了一套强大的网络通信框架,通过其心跳连接和断线重连功能,可以确保服务的稳定性和可靠性。对于Android开发者来说,理解和应用这些机制,能够有效提升应用程序的网络通信质量。
3. **MINA使用手记[1] .shtml** 和 **MINA框架使用总结 .shtml**:这些可能是个人或团队在使用MINA过程中的笔记和总结,可能包含了实践中的技巧、问题解决策略以及最佳实践。 4. **Apache MINA 线程模型配置 .shtml...
总结来说,本教程将引导你从理论到实践,掌握Java NIO的基本原理,理解Mina框架的使用,以及如何在SpringBoot环境中整合Mina实现高效的网络通信。通过这些知识的学习,你将具备开发高并发、高性能网络应用的能力。