一 mina
1.1 mina作用概述
mina是一个基于java nio的网络通信框架。主要屏蔽了网络通信的一些细节,对Socket进行封装,并且是NIO的一个实现架构,可以帮助我们快速的开发网络通信,常用于游戏的开发、中间件服务端的程序中。
Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。
把底层传输的字节码转换为Java对象,提供给应用程序;或者把应用程序返回的结果转换为字节码,交给底层传输。
总结:
1.默认使用的是JAVA NIO 作为底层支持)操作的编程模型
2.主要屏蔽了网络通信的细节,对socket进行封装,并且是nio的一个实现框架,可以帮助我们快速的进行网络通信、游戏、中间价服务的开发。
3.Mina 的API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、接收的数据以及你的业务逻辑即可。
1.2 mina组件的作用
1.IOService:最底层的是IOService,负责具体的IO相关工作。用于描述我们 的客户端和服务端接口,(IoAccept、IoConnector是子类),分别用于服务端和客户端使用;这一层的典型代表有IOSocketAcceptor和 IOSocketChannel。每当有数据到达时,IOService会先调用底层IO接口读取数据,封装成IoBuffer,之后以事件的形式通知上层代码,从而将Java NIO的同步IO接口转化成了异步IO。所以从下图上看,进来的low-level IO经过IOService层后变成IO Event。
2.IOprocessor:是多线程的环境来处理我们的连接请求;IoProcessor 负责调用注册在 IoService 上的过滤器,并在过滤器链之后调用IoHandler。
3.IOFilter: 这个接口定义一组拦截器,,其中数据的encode 与decode是最为重要的、也是你在使用Mina 时最主要关注的地方。
4.IOHandler:这个接口负责编写业务逻辑,也就是接收、发送数据的地方。需要有开发者自己来实现这个接口。
5.IOsession: 是对底层连接(服务器与客户端的特定连接,该连接由服务器地址、端口以及客户端地址、端口来决定)的封装。
1.3 mina的工作流程
1.Acceptor与Connector线程
在 服务器端,bind一个端口后,会创建一个Acceptor线程来 负责监听工作 。这个线程的工作只有一个:调用Java NIO接口在该端口上 select connect事件,获取新建的连接后,封装成IoSession,交由后面的 Processor线程处理。
在客户端,也有一个类似的, 叫Connector的线程与之相对应 。这两类线程的数量只有1个,外界无法控制这两类线程的数量。
2. Processor 线程主要负责具体的IO读写操作和执行后面的IoFilterChain和IoHandler逻 辑。Processor线 程的数量N默认是CPU数量+1
1.4 mina的工作流程
1.服务端流程:
1、 通过SocketAcceptor 同客户端建立连接;
2、 连接建立之后 I/O的读写交给了I/O Processor线程,I/O Processor是多线程的;
3、 通过I/O Processor 读取的数据经过IoFilterChain里所有配置的IoFilter,IoFilter进行消息的过滤,格式的转换,在这个层面可以制定一些自定义的协议;
4、 最后IoFilter将数据交给 Handler 进行业务处理,完成了整个读取的过程;
写入过程也是类似,只是刚好倒过来, 通过IoSession.write 写出数据,然后Handler进行写入的业务处理,处理完成后交给IoFilterChain,进行消息过滤 和协议的转换,最后通过 I/O Processor 将数据写出到 socket 通道。
2.客户端流程:
1、客户端首先创 建一个IOConnector 用来和服务端通信,顾名思义这就是建立的一个连接对象; 2、 在这个连接上创建一个session, 客 户端中的业务方法可以向session中写入数据,数据经过Filter Chain的过滤后会发送给服务端;
3、 从服务端发回的数据也会首先经过Filter Chain的过滤,然后交给IOHandler做进一步的处理
1.5 IOService接口
1.5.1 IOService的作用
用于描述我们的客户端和服务端的接口,其子类是Connector和Acceptor,Connector描述我们的客户端,Acceptor描述服务端。
- Connector描述我们的客户端,Acceptor描述服务端
- IOprocessor多线程的环境来处理我们的连接请求流程。
- IoFilter提供数据的过滤工作,包括编解码、日志等信息的过滤。
- Handler业务对象,自定义handler需要实现IOHanlerAcceptor。
1.5.2 客户端与服务端的作用
I/O Service层
I/O Filter Chain层
I/O Handler层
服务器端需要创建服务器端Socket,监听指定端口并等待请求的带来。
客户端需要连接到服务器端指定的监听端口,使用网络服务。
IoService 抽象的服务(功能)有如下几个:
管理IoSession:创建和删除IoSession,探测会话Idle状态
Filter Chain管理:处理过滤器链,允许用户修改过滤器链执行顺序
Handler的调用:当指定事件发生的时候,负责调用Handler进行处理
统计数据管理:更新消息发生的数量,以及传输的字节数,等等
监听器管理:管理用户设置的 Listener
通信管理:管理端到端数据传输
1.5.3 IOService的子类接口
服务端:
客户端:
1.6 IOprocessor
processor是以nio为基础实现的以多线程的方式来完成读写操作,Java NIO就是基于Reactor模式实现,属于同步非阻塞IO模式
作用: 是为filter读写原始数据的多线程环境 ,如果mina不去实现,我们自己来实现nio的话,需要字节写一个非阻塞读写的多线程环境。
配置processor的多线程环境
通过NioSocketAcceptor(int processorCount)构造函数可以指定多线程处理器的个数。
通过NioSocketConnector()构造函数也可以指定多线程的个数。
1.7 IOFilter接口
1.7.1 filter的作用
1.I/O Filter Chain层是介于I/O Service层与I/O Handler层之间的一层,
:对应用程序和网络这块的传输,就是二进制数据和对象直接的相互转化 ,有相应的解码和编码器。这也是我们过滤器的一种。
1.7.2 过滤器
1.7.3 自定义过滤器
自定义过滤器类: public class MyFilter extends IoFilterAdapter
构造一个ProtocolCodecFilter实例,需要实现一个ProtocolCodecFactory实例,一个ProtocolCodecFactory包含了对消息进行编解码(Codec)的逻辑,这样实 现的好处是将编解码的逻辑和IoFilter解耦合。
设置自定义过滤器
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
1.7.4 常见过滤器
1.7.5 过滤器的流程
1.8 IOHandler接口
这个接口是你编写业务逻辑的地方,读取数据、发送数据基本都在这个接口总完成,这个实例是绑定到IoService 上的,有且只有一个实例(没有给一个IoService 注入一个IoHandler 实例会抛出异常)。
根据Mina的架构,我们知道,在客户端主动发起I/O操作请求以后,会等待Mina触发相应的事件,在经过一组IoFilter之后, 在 IoFilter链的最后一个IoFilter被调用 将要结束的时候,会调用我们注册的IoHandler实现,经过处理来满足实际业务逻辑需要。
1.9 IOSession接口
IOSession:描述的是客户端和服务端的连接,常用于接受和发送数据。
初始化好之后加入到processor负责的一个队列中。processor线程会把队列中的session对应的通道都注册到它自己的selector上,然后这个selector轮询这些通道是否准备就绪,一旦准备就绪就调用对应方法进行处理(read or flushNow)
1.9 长链接与短连接
长连接:通信双方长期的保持一个连接状态不断开,一旦建立连接后,就不断开,除非发生异常,比较消耗IO资源。
如Http协议,当客户端发起http请求,服务器处理http请求,当服务器处理完成后,返回客户端数据后就断开链接。
默认是代开长连接的,处于监听会话状态,可以改成短连接。如下图 服务端设置
二 ioservice接口详解
2.1 作用
实现了对网络通信的客户端和服务端之间的抽象,子接口IOConnector用于描述客户端,子接口IOAcceptor用于描述服务端。
作用:IOService可以管理我们网络通信的客户端和服务端,并且可以管理连接双方的会话session,同样可以添加过滤器。
常用接口为:IoService,IoAcceptor,IoConnector
常用类为:NioSocketAcceptor,NioSocketConnector
分析:
IoService接口声明了服务端的共有属性和行为;
IoAcceptor接口继承了IoService接口,并添加了服务端特有的接口属性及方法,比如bind()方法,成为典型的服务端接口;
IoConnector接口同样继承了IoService接口,并添加了客户端特有的接口属性及方法,比如connect()方法,成为典型的客户端接口;
AbstractIoService实现了IoService中管理服务的方法,比如getFilterChainBuilder方法---获得过滤器链;
AbstractIoService抽象类继承了AbstractIoService抽象类并实现了IoAcceptor接口,成为了拥有管理服务端实现功能的服务端类;我们常用的NioSocketAcceptor就是它的子类;
AbstractIoConnector抽象类继承了AbstractIoService抽象类并实现了IoConnector接口,成为了拥有管理客户端实现功能的客户端类;我们常用的NioSocketConnector就是它的子类;
2.2 api
1.ioservice
2.ioconector
3.ioAcceptor
4.NIOsocketAcceptor
5.NIOsocketConnector