`

底层架构-远程通讯-Mina

 
阅读更多

转:http://www.cnblogs.com/java-zone/archive/2012/04/08/2404164.html

 

一:Mina概要   
 Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。
如下的特性:
1、  基于Java nio的TCP/IP和UDP/IP实现
基于RXTX的串口通信(RS232)
VM 通道通信
2、通过filter接口实现扩展,类似于Servlet filters
3、low-level(底层)和high-level(高级封装)的api:
       low-level:使用ByteBuffers
       High-level:使用自定义的消息对象和解码器
4、Highly customizable(易用的)线程模式(MINA2.0 已经禁用线程模型了):
       单线程
       线程池
       多个线程池
5、基于java5 SSLEngine的SSL、TLS、StartTLS支持
6、负载平衡
7、使用mock进行单元测试
8、jmx整合
9、基于StreamIoHandler的流式I/O支持
10、IOC容器的整合:Spring、PicoContainer
11、平滑迁移到Netty平台
二:实践    
首先讲一下客户端的通信过程:    
客户端通信过程
1.通过SocketConnector同服务器端建立连接
2.链接建立之后I/O的读写交给了I/O Processor线程,I/O Processor是多线程的
3.通过I/O Processor读取的数据经过IoFilterChain里所有配置的IoFilter,IoFilter进行消息的过滤,格式的转换,在这个层面可以制定一些自定义的协议
4.最后IoFilter将数据交给Handler进行业务处理,完成了整个读取的过程
5.写入过程也是类似,只是刚好倒过来,通过IoSession.write写出数据,然后Handler进行写入的业务处理,处理完成后交给IoFilterChain,进行消息过滤和协议的转换,最后通过I/O Processor将数据写出到socket通道
IoFilterChain作为消息过滤链
1.读取的时候是从低级协议到高级协议的过程,一般来说从byte字节逐渐转换成业务对象的过程
2.写入的时候一般是从业务对象到字节byte的过程
IoSession贯穿整个通信过程的始终   
1.创建服务器    
 package com.gewara.web.module.base;

import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.charset.Charset;
import org.apache.mina.core.service.IoAcceptor;

import org.apache.mina.filter.codec.ProtocolCodecFilter;

import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

import org.apache.mina.filter.logging.LoggingFilter;

import org.apache.mina.transport.socket.nio.NioSocketAcceptor;


/** * Mina服务器 * * @author mike * * @since 2012-3-15 */

public class HelloServer

{
        private static final int PORT = 8901;

         // 定义监听端口        

        public static void main(String[] args) throws IOException

       {            

          // 创建服务端监控线程           

            IoAcceptor acceptor = new NioSocketAcceptor();                        

         // 设置日志记录器           

           acceptor.getFilterChain().addLast("logger", new LoggingFilter());                        

        // 设置编码过滤器           

           acceptor.getFilterChain().addLast(

                "codec",

                          new ProtocolCodecFilter(

                                  new TextLineCodecFactory(Charset.forName("UTF-8"))

                       )

             );                       

         // 指定业务逻辑处理器           

           acceptor.setHandler(new HelloServerHandler());                        

         // 设置端口号           

           acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));                        

         // 启动监听线程           

           acceptor.bind();        

       }

}

2.创建服务器端业务逻辑    

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->package com.gewara.web.module.base;
import org.apache.mina.core.service.IoHandlerAdapter;

import org.apache.mina.core.session.IoSession;
/** * 服务器端业务逻辑 * * @author mike * * @since 2012-3-15 */

public class HelloServerHandler extends IoHandlerAdapter

{         

     @Override        

     /**          * 连接创建事件          */        

      public void sessionCreated(IoSession session)

      {            

      // 显示客户端的ip和端口           

                System.out.println(session.getRemoteAddress().toString());        

      }
       

     @Override        

      /**          * 消息接收事件          */        

      public void messageReceived(IoSession session, Object message) throws Exception

     {            

              String str = message.toString();            

              if (str.trim().equalsIgnoreCase("quit"))

              {                

                     // 结束会话               

                     session.close(true);                

                     return;            

              }                        

              // 返回消息字符串           

              session.write("Hi Client!");            

              // 打印客户端传来的消息内容           

             System.out.println("Message written" + str);        

     }

}

3.创建客户端     
package com.gewara.web.module.base;

import java.net.InetSocketAddress;

import java.nio.charset.Charset;
import org.apache.mina.core.future.ConnectFuture;

import org.apache.mina.filter.codec.ProtocolCodecFilter;

import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

import org.apache.mina.filter.logging.LoggingFilter;

import org.apache.mina.transport.socket.nio.NioSocketConnector;


/** * Mina客户端 * * @author mike * * @since 2012-3-15 */

public class HelloClient

{       

            public static void main(String[] args)

            {            

                  // 创建客户端连接器.           

                   NioSocketConnector connector = new NioSocketConnector();                        

                 // 设置日志记录器           

                   connector.getFilterChain().addLast("logger", new LoggingFilter());        

                 // 设置编码过滤器           

                   connector.getFilterChain().addLast(

                          "codec",                    

                                new ProtocolCodecFilter(

                                       new TextLineCodecFactory(Charset.forName("UTF-8")

                                     )

                       )

                 );                        

                 

                // 设置连接超时检查时间           

                  connector.setConnectTimeoutCheckInterval(30);                        

                // 设置事件处理器           

                  connector.setHandler(new HelloClientHandler());                        

                // 建立连接           

                  ConnectFuture cf = connector.connect(

                                     new InetSocketAddress("192.168.2.89", 8901)

                                );                        

                // 等待连接创建完成           

                  cf.awaitUninterruptibly();                        

                // 发送消息             

                  cf.getSession().write("Hi Server!");                       

                // 发送消息           

                  cf.getSession().write("quit");                        

                // 等待连接断开           

                  cf.getSession().getCloseFuture().awaitUninterruptibly();


              // 释放连接           

                  connector.dispose();        

    }

}

4.客户端业务逻辑

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->package com.gewara.web.module.base;
import org.apache.mina.core.service.IoHandlerAdapter;

import org.apache.mina.core.session.IoSession;
public class HelloClientHandler extends IoHandlerAdapter

{        

  @Override        

    /**          * 消息接收事件          */        

    public void messageReceived(IoSession session, Object message) throws Exception

    {            

    //显示接收到的消息           

     System.out.println("server message:"+message.toString());        

    }

}

5.先启动服务器端,然后启动客户端

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->2012-03-15 14:45:41,456 

INFO  logging.LoggingFilter - CREATED /192.168.2.89:2691 2012-03-15 14:45:41,456 

INFO  logging.LoggingFilter - OPENED 2012-03-15 14:45:41,487 

INFO  logging.LoggingFilter -

RECEIVED: HeapBuffer[pos=0 lim=11 cap=2048: 48 69 20 53 65 72 76 65 72 21 0A] 2012-03-15 14:45:41,487 

DEBUG codec.ProtocolCodecFilter - Processing a MESSAGE_RECEIVED for session 1 Message writenHi Server! 2012-03-15 14:45:41,487 

INFO  logging.LoggingFilter - SENT: HeapBuffer[pos=0 lim=0 cap=0: empty] 2012-03-15 14:45:41,487 

INFO  logging.LoggingFilter - RECEIVED: HeapBuffer[pos=0 lim=5 cap=2048: 71 75 69 74 0A] 2012-03-15 14:45:41,487 

DEBUG codec.ProtocolCodecFilter - Processing a MESSAGE_RECEIVED for session 1 2012-03-15 14:45:41,487  INFO  logging.LoggingFilter - CLOSED

三:分析源码
1.首先看服务器

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->// 创建服务端监控线程           

IoAcceptor acceptor = new NioSocketAcceptor();                        

// 设置日志记录器           

acceptor.getFilterChain().addLast("logger", new LoggingFilter());                        

// 设置编码过滤器           

acceptor.getFilterChain().addLast(

     "codec",

           new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))

      )

);

 

// 指定业务逻辑处理器           

acceptor.setHandler(new HelloServerHandler());                        

// 设置端口号           

acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));                        

// 启动监听线程           

acceptor.bind();

1)先创建NioSocketAcceptor nio的接收器,谈到Socket就要说到Reactor模式    
 当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作。他们都有一个共同的结构:
1. Read request
2. Decode request
3. Process service                                    
4. Encode reply
5. Send reply

但这种模式在用户负载增加时,性能将下降非常的快。我们需要重新寻找一个新的方案,保持数据处理的流畅,很显然,事件触发机制是最好的解决办法,当有事件发生时,会触动handler,然后开始数据的处理。 Reactor模式类似于AWT中的Event处理。

Reactor模式参与者

1.Reactor 负责响应IO事件,一旦发生,广播发送给相应的Handler去处理,这类似于AWT的thread 2.Handler 是负责非堵塞行为,类似于AWT ActionListeners;同时负责将handlers与event事件绑定,类似于AWT addActionListener

 

人有两条路要走, 一条是必须走的,一条是想走的,你必须把必须走的路走漂亮,才可以走想走的路。
分享到:
评论

相关推荐

    apache-mina-2.0.7-bin.tar

    标题中的"apache-mina-2.0.7-bin.tar"指的是Apache Mina 2.0.7版本的二进制发布包,该包包含了编译好的库文件和运行时所需的资源,用户可以直接使用而无需自行编译源代码。 描述中提及的"apache-mina-2.0.7-src.tar...

    Apache-Mina-2.rar_apache mina_java mina_mina_mina-core-1.1.3

    这使得Mina可以用于创建高性能的服务器端和客户端应用,例如在数据库连接、远程过程调用(RPC)、即时通讯(IM)等领域。 描述中提到的"Mina中文参考手册"对于中国开发者来说是一份宝贵的资源,它详细介绍了如何使用...

    mina2 实例程序(socket通讯调用远程方法)

    1. **Mina2的基本架构** Mina2的核心组件包括Session、Filter和ProtocolHandler。Session代表了客户端与服务端的连接状态,Filter用于处理网络通信中的数据过滤和转换,而ProtocolHandler则负责具体协议的解析和...

    mina 源码

    在分析"apache-mina-2.0.4"源码时,我们可以深入理解其设计理念、架构以及核心组件。 1. **MINA的设计理念** MINA的核心理念是异步非阻塞I/O,它利用Java NIO(New I/O)库来实现高效的网络通信。通过非阻塞I/O,...

    mina2依赖jar包

    3. **mina-core-2.0.9**: 这是Apache Mina的核心库,包含所有必要的类和接口,用于构建高性能、低延迟的网络应用。它提供了异步I/O模型,支持多种传输协议,并提供事件驱动的编程模型。 4. **slf4j-api-1.7.7**: ...

    mina详细学习资料

    5. **RPC框架**: MINA可以作为底层通信框架,实现远程过程调用(RPC)系统。 通过深入学习MINA的文档、源码和应用实例,开发者可以更好地理解和利用MINA来构建高效、可靠的网络应用程序。MINA的灵活性和强大的功能...

    mina学习笔记,记录所有API

    MINA 提供了一个统一的API,无论底层是TCP/IP还是UDP/IP,甚至本地socket,都可以使用相同的API来处理。这使得开发人员能够专注于业务逻辑,而不是网络编程的细节。 在MINA的学习笔记中,记录的所有API通常会包括...

    Mina框架入门介绍

    通过IoSession、IoHandler和IoFilter的组合,Mina构建了一个灵活、高效且易于扩展的网络通信架构。学习和使用Mina,开发者需要具备JAVA IO、JAVA NIO、Java Socket以及并发库的基础知识,这将有助于更好地理解和应用...

    java 实现的mina server client完全能用的

    5. **Event-driven Architecture**:Mina采用异步事件驱动架构,意味着它不会阻塞在一个I/O操作上,而是通过事件通知机制来处理I/O操作完成。 6. **NIO (Non-blocking I/O)**:Mina底层利用了Java的NIO库,实现了高...

    Android Java Socket框架 Mina2.0

    总之,Android Java Socket框架Mina2.0提供了一个强大的工具集,使得开发者能够更专注于业务逻辑,而无需过多关注底层的网络通信细节。通过理解和掌握Mina,开发者可以构建出高效、稳定、易于扩展的网络应用。

    MINA源码分析,内涵类的讲解

    MINA的目标是让开发者能够专注于应用层的逻辑,而无需关心网络通信的底层细节。在这个“MINA源码分析,内涵类的讲解”中,我们将深入探讨MINA的核心组件和设计模式,以便更好地理解和利用这个强大的框架。 首先,...

    mina文件传输

    1. **Mina基础架构**: Mina采用了事件驱动和非阻塞I/O模型,这是高性能网络应用的基础。它使用了Java NIO(New IO)库,能有效处理大量并发连接,降低了CPU的使用率。 2. **客户端**: - **字符串请求**:客户端...

    Mina实现RPC的例子

    RPC(Remote Procedure Call)是一种使程序能够执行远程服务器上的功能,而无需了解底层网络协议的技术。在本例中,我们将探讨如何使用Apache Mina库来实现RPC服务。Apache Mina是一个开源项目,它提供了一个高度可...

    Mina通信框架应用

    Mina的架构基于三个主要组件:**Filter**、**Session** 和 **ProtocolCodec**。 - **Filter**:类似于Servlet中的Filter,Mina的Filter负责拦截和处理进出的数据。开发者可以自定义过滤器实现特定的功能,比如身份...

    mina开发文档

    在Mina2.0版本中,它提供了丰富的功能和高效的I/O处理机制,使得开发者能够专注于业务逻辑,而不是底层的网络通信细节。 1. **IoService**:这是Mina的核心接口,它是所有I/O通信的起点,定义了服务的基本操作,如...

    mina框架jar

    MINA的目标是降低网络编程的复杂性,让开发者可以专注于业务逻辑,而不是底层的网络通信细节。 MINA的核心特性包括: 1. **非阻塞I/O**:MINA采用NIO(Non-blocking I/O)模型,极大地提高了处理大量并发连接的...

    Mina基础(一)

    - **远程控制**:如SSH、FTP服务器,通过Mina可以轻松实现安全的远程访问。 - **实时数据传输**:如物联网设备的数据上传,Mina的低延迟和高吞吐量特性使其成为理想的选择。 - **游戏服务器**:网络游戏中的实时...

    Hprose 全名是高性能远程对象服务引擎.rar

    目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用。远程调用的应用场景极其广泛,实现的方式也各式各样。 2. 从通信协议的层面 基于 HTTP 协议的(例如基于...

Global site tag (gtag.js) - Google Analytics