MINA(1)-----体系结构分析

时光怂恿深爱的人放手 提交于 2020-01-08 14:06:52

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

一.MINA简介及概述

1、Mina的介绍

Mina是Apche开发的一个基于NIO的网络开源应用框架,是非阻塞模式,使用它编写程序时,可以专注于业务处理,而不用过于关心IO操作。不论应用程序采用什么协议(TCP、UDP)或者其它的,Mina提供了一套公用的接口,来支持这些协议。目前可以处理的协议有:HTTP, XML, TCP, LDAP, DHCP, NTP, DNS, XMPP, SSH, FTP... 。从这一点来说,Mina不仅仅是一个基于NIO的框架,更是一个网络传输层协议的实现。

2、网络分层结构

OSI的7层从上到下分别是:(7)应用层 (6)表示层 (5)会话层 (4)传输层 (3)网络层(2)数据链路层(1)物理层

其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流。

3、Mina在应用程序中处于什么样的位置?

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

二.MINA设计架构

1、MINA整体架构

2、MINA各种组件

上面这个图说明了Mina的处理大致流程。从这个图上也可以看出,大致包括了3个部分:

IoService:执行实际的IO操作,管理 I/O会话。
IoFilter Chain:将数据进行过滤或者转换为期望的数据结构,反之亦然。
IoHandler:实际的业务操作。
所以如果想要使用Mina编写程序,只需要下列3步即可:

创建IoService。
添加IoFilter到FilterChain
编写处理业务逻辑的IoHandler
1)IoService说明

 编写网络程序,一般都分为Server/Clinet。 

(1)IoService接口描述的是客户端和服务端连接的一个抽象,常常用于接收和发送数据。其两个子接口为IoAcceptor和IoConnector,分别用于描述我们的客户端和服务端及IOproceser 多线程环境来处理我们的连接请求。

(2)服务端通过创建一个NioSocketAcceptor来接受请求,客户端通过创建NioSocketConnector来连接服务端并发送请求

(3)Mina为Server端程序提供的IoService实现是IoAcceptor,为客户端提供的实现是IoConnector。IoAcceptor用来接受连接,与客户端进行通讯。IoConnector用来发起连接,与服务端进行通讯。IoAcceptor和IoConnector都分别有基于TCP/IP协议协议,UDP/IP协议以及虚拟机管道通讯的子接口。

Server端实现:

Clint端实现:

2)IoSession说明

Session,这个词都不陌生。在Web开发中有Session的概念,在Hibernate中有Session的概念。Session就是对连接会话的封装,存储一些状态信息。同样在Mina中也有Session的概念。

在Mina会为每一个连接创建Session,并存储在内存中,直到与Client之间连接断开。

3)IoFilter说明

提供数据的过滤工作,起到过滤器的作用并可以加入各种过滤器,以及它的运行原理,开发过Web应用程序的人应该都是知道的。IoFilter的原理与Web应用中的Filter是一样的,这里就不在赘述。如果不清楚Filter的原理,可以参考这里。
使用过滤器可以做哪些事情呢?

(1)日志记录

(2)根据协议对数据进行编码、解码。如下:

应用程序(Java对象或则基本数据类型)  ----- 网络(编码二进制)  -----  业务程序(解码成原数据)

好处是两个程序可以通过网络传输数据,速度比较快。

拓展:Java 不支持显式输入二进制,默认为 10 进制,0 开头为8进制,比如 01111,0x开头为16 进制,比如 0x11。。。

数据存储是以10进制byte字节表示,数据传输是以2进制bit表示的 --> 1byte = 2(0xFFFF) = 8bit

(3)SSL处理

4)IoHandler说明

    Handler就是我们的业务对象,自定义的 Handler 需要继承 IoHandlerAdapter。IoHandler是在最后一个Filter中调用的。主要实现的方法是messageReceived()。就是写你接收到数据后要处理的业务逻辑。

3、大致的类图结构

                                                 IoService

                        IoConnector                          IoAcceptor

                NioSocketConnector              NioSocketAcceptor

总结流程:客户端  IoConnector》IOproceser 》IoFilter》IoHandler

                 服务端  IoAcceptor》IOproceser 》IoFilter》IoHandler

三.MINA的长短连接

1、长连接的定义

概念:通信双方长期保持一个连接状态不断开,比如腾讯qq,当我们登录qq的时候,我们就去连接我们腾讯服务器,一旦建立连接后,就不断开,除非发生异常,这样方式就是长连接。
缺点:对于长连接比较耗费IO资源。
2、短连接的定义

概念:通信双方不是保持一个长期连接状态,比如http协议,当客户端发起http请求时,服务器进行处理 ,当服务器处理完成后,返回客服端数据后就断开连接,对于下次的连接请求需要重新发起,这种方式使我们常使用的。
缺点:不能使用session会话保持连接。
总结:对于Mina我们用session属性来保持会话,采用的是长连接方式,不断接受客户端的数据,这次我们使用短连接的方式。

3、Mina短连接的实现

在服务端Handler处理中,继承IoHandlerAdapter类,实现了messageSent()方法,这个方法主要是发送数据,当我们将发送数据后进行关闭session,就变成了短连接。全部代码请看:MINA快速开发Demo

@Override
    public void messageSent(IoSession session, Object message) throws Exception {
        System.out.println("messageSent:" + "发送数据"); 
        session.close();

————————————————
版权声明:本文为CSDN博主「贪吃丶蛇」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wang_snake/article/details/79572953

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!