`
niedj
  • 浏览: 31024 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

转:Mina框架研究(3)

 
阅读更多

Filters

IoFilter 是MINA框架中一个核心的部分,如下图,对间于IoService和IoHandle之间,用于过滤所有的I/O事件和请求,其扮演的角色就像J2EE中的Servlet。

mina_app_arch

MINA提供不少现成的过滤器:

1、LoggingFilter :日志过滤器,用于记录所有的事件和请求日志.

2、ProtocolCodecFilter:规约解析过滤器,用来将所有收到的ByteBuffer内容转换为POJO消息(对象),实现往来报文的编码和解码;

3、CompressionFilter:压缩过滤器;

4、SSLFilter

 

ProtocolCodecFilter

相对比较常用的是ProtocolCodecFilter,下面主要介绍一下ProtocolCodecFilter的使用:

还是以官方帮助文档中例子来说明(http://mina.apache.org/chapter-11-codec-filter.html)

这是一个图片服务器程序,请求图片的下行报文格式:

image

 

width: 请求图片的宽度 
height: 请求图片的高度 
numchars: 生成的字节个数

 

服务端返回两张图片:

image

length1: 图片1的大小 
image1: 图片1(PNG格式) 
length2: 图片2的大小

image2: 图片2(PNG格式)

 

现在如果想通过MINA框架来实现基于这一简单规约的编解码通信功能,应该如何做呢?

 

    public class ImageServer {
        public static final int PORT = 33789;
     
        public static void main(String[] args) throws IOException {
            ImageServerIoHandler handler = new ImageServerIoHandler();
            NioSocketAcceptor acceptor = new NioSocketAcceptor();
            acceptor.getFilterChain().addLast("protocol", new ProtocolCodecFilter(new ImageCodecFactory(false)));
            acceptor.setLocalAddress(new InetSocketAddress(PORT));
            acceptor.setHandler(handler);
            acceptor.bind();
            System.out.println("server is listenig at port " + PORT);
        }
    }

 这里先来看和Filter有关的部分:

 

acceptor.getFilterChain().addLast("protocol", new ProtocolCodecFilter(new ImageCodecFactory(false)));
在acceptor的Filter链中加入我们自己的过滤器,一个ProtocolCodecFilter的实现,这里的ImageCodecFactory又是什么呢?
    public class ImageCodecFactory implements ProtocolCodecFactory {
        private ProtocolEncoder encoder;
        private ProtocolDecoder decoder;
     
        public ImageCodecFactory(boolean client) {
            if (client) {
                encoder = new ImageRequestEncoder();
                decoder = new ImageResponseDecoder();
            } else {
                encoder = new ImageResponseEncoder();
                decoder = new ImageRequestDecoder();
            }
        }
     
        public ProtocolEncoder getEncoder(IoSession ioSession) throws Exception {
            return encoder;
        }
     
        public ProtocolDecoder getDecoder(IoSession ioSession) throws Exception {
            return decoder;
        }
    }
 ImageCodecFactory是对接口ProtocolCodecFactory 的实现,是用来构建Filter的。ProtocolCodecFactory 接口只有两个方法:
    public interface ProtocolCodecFactory {
     
        public ProtocolEncoder getEncoder(IoSession is) throws Exception;
     
        public ProtocolDecoder getDecoder(IoSession is) throws Exception;
    }
 
没错,这个规约编解码工厂需要装配一个编码器(Encoder)和一个解码器(Decoder):

编码器:

     public class ImageRequestEncoder implements ProtocolEncoder {
      
         public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
             ImageRequest request = (ImageRequest) message;
             IoBuffer buffer = IoBuffer.allocate(12, false);
             buffer.putInt(request.getWidth());
             buffer.putInt(request.getHeight());
             buffer.putInt(request.getNumberOfCharacters());
             buffer.flip();
             out.write(buffer);
         }
      
         public void dispose(IoSession session) throws Exception {
             // nothing to dispose
         }
     }

 解码器:

     public class ImageRequestDecoder extends CumulativeProtocolDecoder {
      
         protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
             if (in.remaining() >= 12) {
                 int width = in.getInt();
                 int height = in.getInt();
                 int numberOfCharachters = in.getInt();
                 ImageRequest request = new ImageRequest(width, height, numberOfCharachters);
                 out.write(request);
                 return true;
             } else {
                 return false;
             }
         }
     }

 这里解码器不是直接从ProtocolDecoder继承的,为什么呢?因为实际中接受的一个数据包并不能保证包含完整的一帧报文,就是所谓的断帧的情况,如果用CumulativeProtocolDecoder,就不需要自己处理这种情况了,MINA框架会将未解码的数据保留,等下一包数据到来后继续尝试解码;

这里编码器的encode和解码器的doDecode方法就是实际用来进行应用层规约编解码的;其中ImageResuest是下行请求规约对应POJO.

整个类的协助关系如下图所示:

 

Main2

 

Filter过滤器处理完后,就交给Handler,做进一步业务处理;

Response部分的就不多罗嗦了,可以看这里

至此对MINA框架用过的一些东西,从使用指南的角度做了一些总结,还有很多方面还没有用过,先留一个坑,等来日填补吧。MINA框架最吸引我的是这种设计思想,将通信、规约解析、业务处理分离得恰到好处,既不影响性能又方便扩展和替换。下一步希望从源代码的角度,学习一下其内部的实现思想。

转自:http://www.cnblogs.com/xiekeli

分享到:
评论

相关推荐

    Mina 框架研究与实现

    ### Mina框架研究与实现 #### 引言 在当今高度网络化的世界中,服务器端程序面临着前所未有的挑战,特别是当需要同时处理成百上千的客户端连接时。这不仅要求服务器具备高性能,还必须保证高可用性。Mina框架正是...

    JAVA mina 框架源码

    JAVA Mina框架是一款高度可扩展、高性能的网络应用开发框架,专为Java平台设计。它提供了丰富的网络通信API,使得开发者能够轻松地构建基于TCP/IP、UDP/IP以及其他协议的服务器和客户端应用程序。Mina框架的核心设计...

    apache-mina-2.0.4.rar_apache mina_mina

    Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的...

    Mina入门:mina版之HelloWorld

    Apache Mina是一个开源项目,它提供了一个高度模块化、高性能的网络通信框架。Mina旨在简化网络应用的开发,支持多种传输协议,如TCP、UDP、HTTP、FTP等。在这个“Mina入门:Mina版之HelloWorld”教程中,我们将探讨...

    mina框架源码及jar包

    在本压缩包"apache-mina-2.0.4"中,包含的是Mina框架的源码和jar包,这为开发者深入理解Mina的工作机制以及自定义功能提供了便利。 **Mina框架的核心概念:** 1. **I/O模型**:Mina基于NIO(Non-blocking I/O)...

    微信小程序 Web MINA框架下载.rar

    微信小程序是一种轻量级的应用开发平台,主要针对移动端,它允许开发者通过微信的开发工具创建出能在微信内部...通过深入研究这个Web MINA框架,开发者能够更好地掌握微信小程序的开发技术,提升自己的项目开发能力。

    mina框架中socket使用,有服务端和客户端。

    8. **学习与实践**:这个项目作为一个完整的示例,非常适合初学者研究和学习MINA框架。通过运行服务端和客户端,可以观察数据交互的过程,理解MINA如何处理网络事件和数据传输。此外,你还可以尝试修改代码,添加新...

    mina框架的使用

    Apache MINA(Multipurpose ...通过研究这些源代码,读者可以更直观地了解MINA框架的使用方法和实现细节。学习这个项目,你可以动手实践MINA的基本用法,理解异步编程模型,以及如何处理网络通信中的各种事件。

    mina2框架+实例教程

    **Mina2框架详解与实例教程** Mina2(全称Apache MINA,Multipurpose Infrastructure for Network Applications)是一个高性能、事件驱动的网络应用程序框架,主要应用于开发网络通信应用,如TCP/IP和UDP/IP协议栈...

    apache下的mina框架的源码

    在深入分析MINA框架源码之前,我们需要理解几个核心概念: 1. **过滤器(Filter)**:MINA采用过滤器链模式处理网络事件,每个过滤器都可以对入站和出站的数据进行处理。过滤器可以用于数据编码、解码、安全处理、...

    mina框架中socket应用的简单小项目,包含了所需jar

    "mina框架中socket应用的简单小项目,包含了所需jar" 这个标题告诉我们这是一个关于使用Apache MINA框架实现的基于Socket通信的小型项目。MINA是一个为高性能网络应用提供高度抽象的Java NIO框架,它简化了网络编程...

    java源码:高性能Java网络框架 MINA.zip

    总而言之,`java源码:高性能Java网络框架 MINA.zip`这个压缩包包含的是MINA框架的源代码,对于希望深入研究Java网络编程、提高系统性能的开发者来说是一份宝贵的资源。通过分析和学习MINA的源码,我们可以了解如何...

    ftpserver mina框架,适合学习

    Apache Mina FTPServer是一个基于Apache Mina框架的轻量级FTP服务器实现,它为开发者提供了构建自定义FTP服务器的能力。这个框架非常适合初学者学习,因为它提供了清晰的结构和丰富的文档,帮助理解网络通信和FTP...

    mina高性能Java网络框架 v2.2.1.zip

    标题"mina高性能Java网络框架 v2.2.1.zip"表明这是Apache MINA框架的一个特定版本——v2.2.1的打包文件,通常包含源代码、文档和其他相关资源。这个版本可能包含了性能优化、bug修复以及新功能的引入,适合用于开发...

    MINA-2.0.0-M3

    标题中的"MINA-2.0.0-M3"指的是MINA框架的第2.0.0-M3版本。这个版本是一个里程碑版本(M3,Milestones),通常在正式版本发布之前,用于收集用户反馈和进行测试。 MINA的核心设计目标是提供一个灵活、可扩展的网络...

    MINA1.7包(源码)

    MINA(Multipurpose Infrastructure for Network Applications)是Apache软件基金会的一个开源项目,主要为构建高性能、跨平台的网络应用程序提供框架。MINA1.7版本是一个成熟的版本,它提供了丰富的网络通信API,...

    基于Java的实例源码-高性能Java网络框架 MINA.zip

    **标题与描述解析** ...总的来说,这个压缩包为Java开发者提供了一个深入理解并实践MINA框架的机会,通过研究源码和示例,可以提升对网络编程和异步事件驱动模型的理解,以及如何利用MINA构建高性能的网络应用。

    mina项目示例

    在压缩包文件"apache-mina"中,可能包含了MINA框架的源码、示例代码、配置文件以及其他相关资源,这些都是学习和研究MINA的好材料。开发者可以通过阅读这些代码,进一步了解MINA在实际应用中的具体实现方式。

    mina框架自定义解编码器

    《MINA框架自定义解编码器的深度解析与实践》 MINA(Java Multithreaded Network Application Framework)是一个开源的、跨平台的Java网络应用框架,它为开发者提供了高度可扩展性和高性能的网络通信能力。MINA的...

Global site tag (gtag.js) - Google Analytics