基于MINA应用程序结构图:

我们可以看出,MINA是应用程序(客户端或服务端)和底层基于TCP,UDP等通讯协议的网络层之间的粘合剂。而且各个模块之间是相互独立的,你只需要在MINA体

系基础上设计你的应用程序,而不用去处理复杂的网络层。

下图展示了MINA的内部组件以及MINA各个组件的功能。

很显然,基于MINA的应用程序被划分为3层:

1. I/O Service  -- 执行真正的I/O操作

2. I/O Filter Chain -- 过滤,转换字节流为想要的数据结构

3. I/O Handler -- 实现顶层业务逻辑

因此,想要创建基于MINA的应用程序,须完成以下操作:

1. 创建 I/O Service  --从已有可用的Service(*Acceptor) 或创建你定义的

2. 创建Filter Chain  --  从已有可有的Filter中选择或者创建自定义的Filter

3. 创建I/O Handler  -- 写业务逻辑来处理不同的消息

MINA服务端体系

上文已经介绍了基于MINA应用程序的一个整体的结构,现在我们来看看服务端的结构。主要来说,服务端侦听一个端口来接受请求,处理请求并给出响应。并且服务端也会为

每一个客户端维护一个Session,Session以后会详细介绍。


MINA服务端处理流程:

1. IOAcceptor 侦听网络上的链接和包

2. 针对每一个链接,一个新的session将会被创建,并且随后该 Ip+ 端口上的请求都会被这个session处理

3. 所有的包从Session处接受后,传送给Filter,Filters 用于修改包内容(如将字节流转换成特定的java bean,增加或删除信息等等),将字节流和java bean业务对象之

相互转换常常会用到PacketEncoder / Decoder两个类

4. 最后,转换后的包或对象将由IOHandler来处理

Session 创建:

只要有客户端连接到MINA服务端,都会为该链接创建一个Sessiion并在Session存放一些数据。

传入的消息处理:

假设一个Session已经被创建,任何传入的消息都将会导致Selector唤醒。

MINA 客户端体系

上文已经介绍了MINA结构体系以及服务端体系,现在来介绍下MINA的客户端结构体系。客户端需要连接上服务端,并发送请求和处理应答。



MINA客户端处理流程:

1. 客户端首先创建一个IOConnector(MINA 体系中的结构,用于Socket连接),然后绑定到服务端(即连接到服务端的IP和端口)。
2. 连接建立后,将会创建一个Session并将该session绑定到连接上

3. 应用程序或客户端向session中写入数据,在经过过滤器链(Filter Chain)转换后,发送给服务端

4. session接收到从服务端发送过来的数据,经过Filter Chain过滤转换处理后,交由IOHandler去处理


Simple Tcp Server


1. 服务端 IOHandler
  1. import java.util.Date;
  2.  
  3. import org.apache.mina.core.session.IdleStatus;
  4. import org.apache.mina.core.service.IoHandlerAdapter;
  5. import org.apache.mina.core.session.IoSession;
  6.  
  7. public class TimeServerHandler extends IoHandlerAdapter
  8. {
  9. @Override
  10. public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
  11. {
  12. cause.printStackTrace();
  13. }
  14. @Override
  15. public void messageReceived( IoSession session, Object message ) throws Exception
  16. {
  17. String str = message.toString();
  18. if( str.trim().equalsIgnoreCase("quit") ) {
  19. session.close();
  20. return;
  21. }
  22. Date date = new Date();
  23. session.write( date.toString() );
  24. System.out.println("Message written...");
  25. }
  26. @Override
  27. public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
  28. {
  29. System.out.println( "IDLE " + session.getIdleCount( status ));
  30. }
  31. }

2. 启动服务端

  1. import java.io.IOException;
  2. import java.net.InetSocketAddress;
  3. import java.nio.charset.Charset;
  4.  
  5. import org.apache.mina.core.service.IoAcceptor;
  6. import org.apache.mina.core.session.IdleStatus;
  7. import org.apache.mina.filter.codec.ProtocolCodecFilter;
  8. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
  9. import org.apache.mina.filter.logging.LoggingFilter;
  10. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
  11.  
  12. public class MinaTimeServer
  13. {
  14. private static final int PORT = 9123;
  15. public static void main( String[] args ) throws IOException
  16. {
  17. IoAcceptor acceptor = new NioSocketAcceptor();
  18. acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
  19. acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
  20. acceptor.setHandler( new TimeServerHandler() );
  21. acceptor.getSessionConfig().setReadBufferSize( 2048 );
  22. acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
  23. acceptor.bind( new InetSocketAddress(PORT) );
  24. }
  25. }

3. 启动服务端后,可用telnet 127.0.0.1 9123 来测试。

Simple Tcp Clinent:


1. IOHandler 省略

2. 客户端连接到服务端
  1. public static void main(String[] args) throws Throwable {
  2. NioSocketConnector connector = new NioSocketConnector();
  3. connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);
  4.  
  5. if (USE_CUSTOM_CODEC) {
  6. connector.getFilterChain().addLast("codec",
  7. new ProtocolCodecFilter(new SumUpProtocolCodecFactory(false)));
  8. } else {
  9. connector.getFilterChain().addLast("codec",
  10. new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
  11. }
  12.  
  13. connector.getFilterChain().addLast("logger", new LoggingFilter());
  14. connector.setHandler(new ClientSessionHandler(values));
  15. IoSession session;
  16.  
  17. for (;;) {
  18. try {
  19. ConnectFuture future = connector.connect(new InetSocketAddress(HOSTNAME, PORT));
  20. future.awaitUninterruptibly();
  21. session = future.getSession();
  22. break;
  23. } catch (RuntimeIoException e) {
  24. System.err.println("Failed to connect.");
  25. e.printStackTrace();
  26. Thread.sleep(5000);
  27. }
  28. }
  29.  
  30. // wait until the summation is done
  31. session.getCloseFuture().awaitUninterruptibly();
  32. connector.dispose();
  33. }


至此,简单介绍了MINA的整体结构,服务端结构,客户端结构及各自的处理流程,下篇将会介绍IOService层。

MINA学习之体系介绍的更多相关文章

  1. 【转】线程池体系介绍及从阿里Java开发手册学习线程池的正确创建方法

    jdk1.7中java.util.concurrent.Executor线程池体系介绍 java.util.concurrent.Executor : 负责线程的使用与调度的根接口  |–Execut ...

  2. Java并发包下锁学习第一篇:介绍及学习安排

    Java并发包下锁学习第一篇:介绍及学习安排 在Java并发编程中,实现锁的方式有两种,分别是:可以使用同步锁(synchronized关键字的锁),还有lock接口下的锁.从今天起,凯哥将带领大家一 ...

  3. javaWeb课程体系介绍

    javaWeb课程体系介绍-一般必须学的课程: JavaSE开发Java基础编程Java核心编程Java高级编程DataBase开发MySQLJDBCJavaEE开发Web基础SpringSpring ...

  4. 人工智能深度学习Caffe框架介绍,优秀的深度学习架构

    人工智能深度学习Caffe框架介绍,优秀的深度学习架构 在深度学习领域,Caffe框架是人们无法绕过的一座山.这不仅是因为它无论在结构.性能上,还是在代码质量上,都称得上一款十分出色的开源框架.更重要 ...

  5. iOS学习之NSBundle介绍和使用

    iOS学习之NSBundle介绍和使用 http://blog.csdn.net/totogo2010/article/details/7672271 新建一个Single View Applicat ...

  6. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

  7. Oracle GoldenGate学习之Goldengate介绍

    Oracle GoldenGate学习之Goldengate介绍 (2012-10-02 17:07:27) 标签: 检查点 数据传输 队列 进程 分类: Goldengate Goldengate介 ...

  8. JMeter学习工具简单介绍

    JMeter学习工具简单介绍   一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态 ...

  9. MINA学习汇总

    MINA学习汇总 Apache Mina Server 是一个网络通信应用框架,用于开发高性能和高可用性的网络应用程序.它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(然,也可以提供JAVA ...

随机推荐

  1. Sublime Text 3 LESS、SASS、SCSS高亮插件、提示插件

    为sublime text 添加LESS语法高亮 功能:LESS高亮插件   下载   https://packagecontrol.io/packages/LESS 简介:用LESS的同学都知道,s ...

  2. mysql 清空表 Truncate及delete区别

    1.delete from 表名[where]; 2.truncate table 表名; 3.delete将mysql表中所有记录一条一条删除到删完 4.truncate保留mysql表的结构,重新 ...

  3. Function Pointer in Delpni

    program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TVoice = function(): Stri ...

  4. PHP利器-WAMPServer

    为了配置memcacheAdmin,牵涉到搭建PHP的环境,使用的是WAMPServer,安装之后,需要对apache进行配置, 端口,需要将wamp\bin\apache\Apache2.2.21\ ...

  5. DEEP LEARNING IS THE FUTURE: Q&A WITH NAVEEN RAO OF NERVANA SYSTEMS

    DEEP LEARNING IS THE FUTURE: Q&A WITH NAVEEN RAO OF NERVANA SYSTEMS CME Group was one of several ...

  6. 公告: 新博客已经迁移到 www.root.run

    root.run www.root.run www.root.run/sitemap.html www.root.run/sitemap.xml

  7. Learing WCF Chapter1 WCF Services

    WCF ServicesWCF services are the new distributed boundary in an enterprise application—with an empha ...

  8. 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

    一张图看懂开源许可协议,开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区别 首先借用有心人士的一张相当直观清晰的图来划分各种协议:开源许可证GPL.BSD.MIT.Mozi ...

  9. Linux下对拍脚本与随机数生成器

    对拍脚本 新建一个文档 check.sh 作为对拍脚本. #!/bin/bash while(true)do #死循环 ./data > .in #运行数据生成器,将数据输出到1.in ./st ...

  10. ☀【CSS3】形状

    CSS3shapeshttp://www.css3shapes.com/ <!DOCTYPE html> <html lang="zh-CN"> <h ...