前言:今天又看了一下mina框架,理解果然深入了, 下面我来分享我的心得
mina框架能解决的问题:
主要解决多客户端连接同一个服务器端
mina几个重要接口:
IoServiece :这个接口在一个线程上负责套接字的建立,拥有自己的 Selector,监听是否有连接被建立。
IoProcessor :这个接口在另一个线程上负责检查是否有数据在通道上读写,也就是说它也拥有自己的 Selector,这是与我们使用 JAVA NIO 编码时的一个不同之处,通常在 JAVA NIO 编码中,我们都是使用一个 Selector,也就是不区分 IoService与 IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在 IoService 上的过滤器,并在过滤器链之后调用 IoHandler。
IoAccepter :相当于网络应用程序中的服务器端
IoConnector :相当于客户端
IoSession :当前客户端到服务器端的一个连接实例
IoHandler :这个接口负责编写业务逻辑,也就是接收、发送数据的地方。这也是实际开发过程中需要用户自己编写的部分代码。
IoFilter :过滤器用于悬接通讯层接口与业务层接口,这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write 方向)与解码(read 方向)等功能,其中数据的 encode与 decode是最为重要的、也是你在使用 Mina时最主要关注的地方。</strong></span>
mina框架原理图:
客户端的通信过程:
通过SocketConnector同服务器端建立连接。
链接建立之后I/O的读写交给了I/O Processor线程,I/O Processor是多线程的。
通过I/O Processor读取的数据经过IoFilterChain里所有配置的IoFilter,IoFilter进行消息的过滤,格式的转换,在这个层面可以制定一些自定义的协议。
最后IoFilter将数据交给Handler进行业务处理,完成了整个读取的过程。
写入过程也是类似,只是刚好倒过来,通过IoSession.write写出数据,然后Handler进行写入的业务处理,处理完成后交给IoFilterChain,进行消息过滤和协议的转换,最后通过I/O Processor将数据写出到socket通道。
IoFilterChain作为消息过滤链
- 读取的时候是从低级协议到高级协议的过程,一般来说从byte字节逐渐转换成业务对象的过程。
- 写入的时候一般是从业务对象到字节byte的过程。
原理解说: 服务器端开启监听,客户端开始连接(注意这里得客户端会有很多个),这时候 首先 socket通道开启了,然后 iosession监听开启,然后 开始执行 IOprocessor 、 iofileter 、Handler ,
socket作用:传输数据(俗称管道), 本人理解也为建立连接的管道标识.
iosession 是整个 客户端到服务端的生命周期,当然客户端和服务器端都可以关闭 session.
问题:项目中有很多个设备,客户端是不断地给服务器端发送连接,那么问题来了,如何在服务器端关闭到当前的客户端socket呢(注意不是session) 我们可以这样 session.getService().dispose(); 完美关闭
这样的话,当socket都关闭了, 那么这个客户端(我所说的设备) 就彻底和服务端断开了(也就是不时时连接了).
其余的方法和demo 请自行百度搜索