`
ikon
  • 浏览: 103242 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mina 框架总结

 
阅读更多

 

简单介绍:MINA框架是对java的NIO包的一个封装,简化了NIO程序开发的难度,封装了很多底层的细节,然开发者把精力集中到业务逻辑上来,最近做了一个相关的项目,为了备忘对MINA做一个总结。

下面这个start方法用来初始化MINA:

Java代码 
  1. private void start(int port, WebContext ctx)    
  2.       throws IOException, InstantiationException   
  3.         , IllegalAccessException, ClassNotFoundException {   
  4.     //初始化Acceptor   
  5.     NioSocketAcceptor acceptor = new NioSocketAcceptor(5);   
  6.            
  7.        java.util.concurrent.Executor threadPool = Executors.newFixedThreadPool(1500);//建立线程池   
  8.        //加入过滤器(Filter)到Acceptor   
  9.        acceptor.getFilterChain().addLast("exector"new ExecutorFilter(threadPool));   
  10. acceptor.getFilterChain().addLast("codec",    
  11.        new ProtocolCodecFilter(new WebDecoder(),new WebEncoder()));   
  12.        LoggingFilter filter = new LoggingFilter();   
  13.     filter.setExceptionCaughtLogLevel(LogLevel.DEBUG);   
  14.     filter.setMessageReceivedLogLevel(LogLevel.DEBUG);   
  15.     filter.setMessageSentLogLevel(LogLevel.DEBUG);   
  16.     filter.setSessionClosedLogLevel(LogLevel.DEBUG);   
  17.     filter.setSessionCreatedLogLevel(LogLevel.DEBUG);   
  18.     filter.setSessionIdleLogLevel(LogLevel.DEBUG);   
  19.     filter.setSessionOpenedLogLevel(LogLevel.DEBUG);   
  20.     acceptor.getFilterChain().addLast("logger", filter);    
  21.            
  22.        acceptor.setReuseAddress(true);//设置的是主服务监听的端口可以重用   
  23.            
  24.        acceptor.getSessionConfig().setReuseAddress(true);//设置每一个非主监听连接的端口可以重用   
  25.        acceptor.getSessionConfig().setReceiveBufferSize(1024);//设置输入缓冲区的大小   
  26.        acceptor.getSessionConfig().setSendBufferSize(10240);//设置输出缓冲区的大小   
  27. //设置为非延迟发送,为true则不组装成大包发送,收到东西马上发出   
  28.        acceptor.getSessionConfig().setTcpNoDelay(true);   
  29. //设置主服务监听端口的监听队列的最大值为100,如果当前已经有100个连接,再新的连接来将被服务器拒绝   
  30.        acceptor.setBacklog(100);   
  31.        acceptor.setDefaultLocalAddress(new InetSocketAddress(port));   
  32.        //加入处理器(Handler)到Acceptor   
  33.        acceptor.setHandler(new WebHandler());   
  34.     acceptor.bind();   
  35. }  

 NioSocketAcceptor是MINA的适配器,一切都是从这里开始的。MINA中有个过滤器和处理器的概念,过滤器用来过滤数据,处理器用来处理数据。具体来说MINA的处理模型就是request->过滤器A->过滤器B->处理器->过滤器B->过滤器A->response,这里的request和response类似serlvet的request和response。

Java代码 
  1. acceptor.getFilterChain().addLast("exector"new ExecutorFilter(threadPool));   
  2. //加入一个线程池到适配器,这里用的是jdk自带的线程池  
 
Java代码 
  1.  acceptor.getFilterChain().addLast("codec",    
  2.         new ProtocolCodecFilter(new WebDecoder(),new WebEncoder()));   
  3. //这里是处理逻辑的关键部位,请求的处理都是在 WebDecoder类和WebEncoder类中处理,可以明显从命名上看出来一个是用来解码,另一个是用来编码,requet过来后先进入 WebDecoder类(实现了ProtocolDecoder接口)进行解码处理,这里可以加入自己的逻辑把传进来的流解码成自己需要的信息。而 WebEncoder类(实现了ProtocolEncoder接口)是进行编码,在这个类里面加入自己的逻辑把处理后的信息组装发送给客户端 (response)。而在解码和编码过程中WebHandler(扩展了IoHandlerAdapter抽象类)起到了处理器的作用。   
  4. //request->WebDecoder->WebHandler->WebEncode->response  

 

现在详细描述一下request->WebDecoder->WebHandler->WebEncode->response的过程:

客户端发送一个请求到MINA服务器,这里相当于来了一个requet。请求首先来到

Java代码 
  1. WebDecoder类(实现了ProtocolDecoder接口)中的    
  2. boolean decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception{}方法   
  3. /*  
  4. 参数in:用户请求信息全存在这里,读数据就从in这里读。  
  5. 参数out:用来输出处理后的数据到Filter的下一个过滤器,如果没有过滤器了就输出到WebHandler,这里有点和  
  6. servelt的过滤器类似。利用out.write(Object object);这个函数可以把数据传到下一个Filter。我们可以自己定义  
  7. 一个对象,我们假设为Request,用它来传递消息,那末这里就可以写成out.write(new RequsetMessage());  
  8. 如果这个方法返回false,就是说当前逻辑包还没接收完(也就是当前的IoBuffer并没有包含足够的数据),需要再次  
  9. 执行decode方法(再次获取新的IoBuffer),用来获取足够的数据。如果返回值为true就表示可以不执行decode方  
  10. 法了,但是要激活handler方法,必须要调用out.write方法。  
  11. public class RequestMessage{}//这里什么也不做  
  12. */  

 然后到

Java代码 
  1. WebHandler(扩展了IoHandlerAdapter抽象类)中的   
  2. void messageReceived(IoSession session, Object message) throws Exception{}方法   
  3. WriteFuture future = session.write(response);//session中必须加入这个代码,才会激活encode方法   
  4. future.addListener(IoFutureListener.CLOSE);//这个的作用是发送完毕后关闭连接,加了就是短连接,不然是长连接   
  5. IoFutureListener里面有个operationComplete(IoFuture future)方法,当流发送完成之后才调用这个方法。   
  6. /*  
  7. 参数message:用来获取Filter传递过来的对象.对应代码RequestMessage request = (RequestMessage) message;  
  8. 参数session:用来发送数据到Filter.对应代码session.write(new ResponseMessage());  
  9. public class ResponseMessage{}//这里什么也不做,假设存放处理后的数据  
  10. 注意:对于一个MINA程序而言,对于WebHandler类只生成一个对象,所以要考虑线程安全问题  
  11.  */  
 

然后到

Java代码 
  1. WebEncoder类(实现了ProtocolEncoder接口)中的   
  2. boolean encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception{}    
  3. 方法   
  4. /*  
  5. 参数message:用来获取上一个Filter节点的数据或者处理器的数据(如果这个过滤器为最靠近处理器的那个)  
  6. ResponseMessage response = (ResponseMessage)message;  
  7. 参数out:用来输出数据到下一个Filter节点过或者到客户端,用out.write(Object encodedMessage)把数据发送  
  8. 出去,但是要注意的是,如果这个Filter下一个节点如果是客户端的话,那个这个encodedMessage数据必须为  
  9. IoBuffer类型的,可以利用IoBuffer.wrap(byte[] byteArray)这个方法来格式化输出数据  
  10. */  

 

分享到:
评论

相关推荐

    mina框架使用总结

    nio的经典框架mina 在此基础上发展的netty是nio经典之中的经典

    MINA框架使用总结

    阻塞和非阻塞io的简单通信程序,自己写的(写的不好)放这里做个备份 博文链接:https://javag.iteye.com/blog/221595

    mina框架使用总结.doc

    java mina框架使用总结

    服务器框架MINA使用经验总结

    服务器框架MINA使用经验总结 socket协议通信框架

    niosocket及其开源框架MINA学习总结收集.pdf

    niosocket及其开源框架MINA学习总结收集.pdf

    Mina通信框架应用

    mina 通信框架应用,简单的入门,客户端和服务端的结构总结

    mina高性能Java网络框架.rar

    mina是一个基于java nio的网络通信框架。主要屏蔽了网络通信的一些细节,对Socket进行封装,并且是NIO的一个实现架构,可以帮助我们快速的开发网络通信,常用于游戏的开发、中间件服务端的程序中。 Apache的Mina...

    Netty权威指南(第2版)

    长期从事高性能通信软件的架构设计和开发工作,有多年在NIO领域的设计、开发和运维经验,精通NIO编程和Netty、Mina等主流NIO框架。目前负责华为软件公司下一代SOA中间件和PaaS平台的架构设计工作。

    Netty权威指南 第2版 带书签目录

    长期从事高性能通信软件的架构设计和开发工作,有多年在NIO领域的设计、开发和运维经验,精通NIO编程和Netty、Mina等主流NIO框架。目前负责华为软件公司下一代SOA中间件和PaaS平台的架构设计工作。

    【helloworld】-微信小程序教程-入门篇【6】

    1. 开篇导言  本节目标:对于入门篇的总结 目标用户:无编程经验,但对微信小程序感兴趣的同学。... -> MINA框架的目录结构,文件后缀及其定位。 了解,并习惯使用->调试工具:Wxml、Console、Sources

    java 精美 多人聊天系统

    4、网络通信采用MINA2.0,为整个项目省去socket和多线程的麻烦,好的框架才使得整个项目增添了如此之多的功能; 5、本人与朋友已经为消灭Bug做出了很多努力,但仍然不乏一些尚未实现或存在bug的功能,有不合理的...

    文字识别解读小程序.zip

    小程序 MINA JavaScript 文字识别 基于小程序开发设计一款智能文字识别查询小程序,采用Java音进行开发,使用开放API现图片文字识别,不用安装、使用方便,对方便人民的生活产生积极意义。 系统的基本环境是以...

    travelibrary-微信小程序实战-流动图书馆.zip

    预览链接技术栈小程序MINA框架: 一个响应的数据绑定框架。分为两块视图层(View)和逻辑层(App Service)Flex:flex弹性布局Express : http服务框架websocket: 前后端消息的实时推送mongoose: 操作mongodb数据库pm2: ...

Global site tag (gtag.js) - Google Analytics