`
tianting_wx
  • 浏览: 42687 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

Mina研究笔记

    博客分类:
  • mina
阅读更多

MINA 基本类的描述

在介绍架构之前先认识几个接口:

 

IoAccepter 相当于网络应用程序中的服务器端(IoAcceptorIoService的一个扩展)

 

IoConnector 相当于客户端

 

IoSession 当前客户端到服务器端的一个连接实例

 

IoHandler 业务处理逻辑

 

 

IoFilter 过滤器用于悬接通讯层接口与业务层接口

 

 

 

MINA框架的常用类


类NioSocketAcceptor用于创建服务端监听;

 
类NioSocketConnector用于创建客户端连接;

 
类IoSession用来保存会话属性和发送消息;


类IoHandlerAdapter用于定义业务逻辑

 

MINA 的基础架构

 

 

在图中的模块链中,IoService 便是应用程序的入口,相当于我们前面代码中的 IoAccepterIoAccepter 便是 IoService 的一个扩展接口。

IoService 接口可以用来添加多个 IoFilter,这些 IoFilter 符合责任链模式并由 IoProcessor 线程负责调用。

IoAccepter ioService 接口的基础上还提供绑定某个通讯端口以及取消绑定的接口。在上面的例子中,我们是这样使用 IoAccepter 的:

 

IoAcceptor acceptor = new SocketAcceptor();

 

  

相当于我们使用了 Socket 通讯方式作为服务的接入,当前版本的 MINA 还提供了除 SocketAccepter 外的基于数据报文通讯的 DatagramAccepter 以及基于管道通讯的 VmPipeAccepter。另外还包括串口通讯接入方式,目前基于串口通讯的接入方式已经在最新测试版的 MINA 中提供。你也可以自行实现 IoService 接口来使用自己的通讯方式。

 

而在上图中最右端也就是 IoHandler,这便是业务处理模块。相当于前面例子中的 HelloHandler 类。在业务处理类中不需要去关心实际的通讯细节,只管处理客户端传输过来的信息即可。编写 Handler 类就是使用 MINA 开发网络应用程序的重心所在,相当于 MINA 已经帮你处理了所有的通讯方面的细节问题。为了简化 Handler 类,MINA 提供了 IoHandlerAdapter 类,此类仅仅是实现了 IoHandler 接口,但并不做任何处理。

 

一个 IoHandler 接口中具有如下一些方法(摘自 MINA API 文档):

 

void exceptionCaught(IoSession session, Throwable cause)

                   当接口中其他方法抛出异常未被捕获时触发此方法 

void messageReceived(IoSession session, Object message)

                   当接收到客户端的请求信息后触发此方法. 

void messageSent(IoSession session, Object message)

                   当信息已经传送给客户端后触发此方法. 

void sessionClosed(IoSession session)

                   当连接被关闭时触发,例如客户端程序意外退出等等. 

void sessionCreated(IoSession session)

                   当一个新客户端连接后触发此方法. 

void sessionIdle(IoSession session, IdleStatus status)

                   当连接空闲时触发此方法. 

void sessionOpened(IoSession session)

                   当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发 

  

前面我们提到 IoService 是负责底层通讯接入,而 IoHandler 是负责业务处理的。那么 MINA 架构图中的 IoFilter 作何用途呢?答案是你想作何用途都可以。但是有一个用途却是必须的,那就是作为 IoService IoHandler 之间的桥梁IoHandler 接口中最重要的一个方法是 messageReceived,这个方法的第二个参数是一个 Object 型的消息,总所周知,Object 是所有 Java 对象的基础,那到底谁来决定这个消息到底是什么类型呢?答案也就在这个 IoFilter 中。在前面使用的例子中,我们添加了一个 IoFilter new ProtocolCodecFilter(new TextLineCodecFactory()),这个过滤器的作用是将来自客户端输入的信息转换成一行行的文本后传递给 IoHandler,因此我们可以在 messageReceived 中直接将 msg 对象强制转换成 String 对象。

 

而如果我们不提供任何过滤器的话,那么在 messageReceived 方法中的第二个参数类型就是一个 byte 的缓冲区,对应的类是 org.apache.mina.common.ByteBuffer。虽然你也可以将解析客户端信息放在 IoHandler 中来做,但这并不是推荐的做法,使原来清晰的模型又模糊起来,变得 IoHandler 不只是业务处理,还得充当协议解析的任务。

 

MINA自身带有一些常用的过滤器,例如LoggingFilter(日志记录)、BlackListFilter(黑名单过滤)、CompressionFilter(压缩)、SSLFilterSSL加密)等。

  

特点

各种传输层提供统一的API  Tcp/ip,Udp/ip,管道通信,可定制。提供高层和低层API:低层使用ByteBuffer,高层使用用户自定义的消息对象和编码解码。通过StreamIoHandler支持基于流的IO使用过滤器接口作为扩展点。l         通过SSLFilter支持SSL.。需要Java 5 SSLenginel         线程池实现为过滤器。可以定制线程模型。

FAQ

MINA可以创建客户端应用吗?

可以,参见IoConnector/ProtocolConnector

MINA可以处理文本协议,例如HTTP?

可以,参见Reserver/Http Server例子。

MINIA可以处理复杂二进制协议?

可以,参见SumUp

MINA可以实现协议保持连接吗?

可以,MINA不关闭任何连接,除非调用了session.close()或者远程主机关闭。

MINA支持TLS/SASL?

不支持。

我的IoHandler需要线程安全吗?

依赖于实现。

MINA可以支持除了TCP,UDP之外的传输层吗?

MINA设计为传输独立的。计划实现Pre-1.4I/O,广播,Java Commnunications API,File IO等。

支持广播吗?

不支持,因为NIO不支持。

怎样存储特定会话信息?

Sessions是可以在任何时候添加或删除的定制属性。这些定制属性没有设计为会话之间共享。

怎么分一个事件处理器到多个处理器?

参见DemuxingIoHandler

客户端会话关闭之后怎么重连接?

public void sessionClosed( ProtocolSession session ) throws Exception{    // Wait for five seconds before reconnecting; you'll have to perform    // reconnection in other thread if you're using MINA 0.7 or 0.8.    // (You don't need to do if you're using MINA 0.9 or above.)    Thread.sleep( 5000 );         // Reconnect.    connector.connect( session.getRemoteAddress(), this );}

什么时候我的协议处理器应该使用过滤器?

IoFilter/ProtocolFilter类似于Servlet中的Filter。例如授权或日志应使用过滤器。

怎么发现远端没有发送相应消息?

你不能简单使用sessionIdle事件。你应该使用定时器Timer/TimerTask/Quartz,定时的间检查请求消息。

怎么添加一个过滤器到特定会话或端口?

IoSession.getFilterChain()ProtocolSession.getFilterChain()可以获取相应的过滤链。你可以添加任何特定会话的过滤链。但你不能添加端口过滤器。不得不创建多个IoAcceptor/ProtocolAcceptor,因为每个接受器有一个过滤链。

在高负载情况下响应超时和连接复位。

可能直接memory太高了。添加直接memory, -XX:MaxDirectMemorySize

没有数据写到会话,尽管buffer不为空。

检查ByteBuffer.flip()

创建了SSLClient,但会话打开之后没有初始化握手.

确保初始化连接之前调用SSLFilter.setUseClientMode(true).

 

分享到:
评论

相关推荐

    Mina学习笔记

    Apache Mina是一个基于Java的网络通信框架,专为高性能、高可用性和可扩展性而设计。这个框架使得开发者能够轻松地构建网络应用,如TCP/IP和UDP协议的服务器和客户端。下面将详细介绍Mina的基本概念、核心接口以及...

    mina学习笔记,记录所有API

    在MINA的学习笔记中,记录的所有API通常会包括以下几个核心部分: 1. **IoSession**: 这是MINA的核心接口,代表了客户端和服务器之间的连接。IoSession提供了读写数据、管理连接状态、获取会话属性等功能。例如,`...

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    MIna2.0学习笔记

    Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,主要用在开发网络通信应用,如TCP/IP和UDP协议的应用。Mina2.0作为其更新版本,提供了更丰富的功能和优化的性能,使得开发者能更高效地构建网络服务。 *...

    Mina2.0学习笔记(修订版).

    Apache Mina是一个高性能、事件驱动的网络应用框架,主要用于简化开发服务器端的复杂性,尤其在处理TCP/IP、UDP和SSL/TLS等协议时。它提供了丰富的API和工具,使得开发者能够快速构建网络应用程序,如FTP、SMTP、...

    apache mina 学习笔记三(子项目FtpServer)

    在本学习笔记中,我们将专注于MINA的子项目——FtpServer,它是实现FTP服务器功能的一个模块。 FTP(File Transfer Protocol)是一种广泛使用的互联网协议,用于在不同主机之间传输文件。Apache MINA FtpServer提供...

    Mina2.0学习笔记(完整版).doc

    Apache Mina是一个强大的开源框架,专门用于构建高性能、高可扩展性的网络应用程序。Mina2.0是其一个重要的版本,提供了许多改进和新特性,使得开发者能够更轻松地处理网络通信任务,尤其是在Java NIO(Non-blocking...

    Mina 学习笔记(入门)

    **Mina 学习笔记(入门)** Apache Mina 是一个高度可扩展的网络通信框架,主要用于构建高性能、高效率的服务器端应用。它提供了一种简单的方式来处理网络协议,如TCP/IP和UDP/IP,以及SSL/TLS加密的连接。在本学习...

    Apache mina2学习笔记DEMO

    在这个"Apache MINA2学习笔记DEMO"中,我们很可能会看到如何使用MINA来创建一个自定义协议的示例。自定义协议通常是为了满足特定应用的需求,例如高效的数据传输、安全性或者特定的编码格式。MINA允许开发者定义自己...

    mina学习笔记

    《mina学习笔记》 Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源框架,主要设计用于简化网络应用程序的开发,尤其是TCP和UDP协议的应用。MINA 提供了一种与网络协议无关的API,...

    MINA学习笔记(仅供参考)

    ### MINA学习笔记 #### MINA概述 MINA是一个用Java编写的高性能、轻量级的网络通信框架,主要用于简化网络编程的复杂性。它支持多种传输协议(如TCP/IP和UDP/IP),并且提供了一套丰富的API来处理网络通信相关的...

    Apache_Mina2.0学习笔记

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 引言 1 一. Mina入门 2 第一步.下载使用的Jar包 2 第二步.工程创建配置 2 第三步.服务端程序 3 第四步.客户端程序 6 第五步.长...

    Mina 框架研究与实现

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

    Mina学习笔记(修订版)

    MINA 是一个网络应用框架,有助于用户非常方便地开发高性能、高伸缩性的网络应用。 此文档80多页,是方便Mina上手的文档。

Global site tag (gtag.js) - Google Analytics