java之网络通信框架mina

一 mina

1.1 mina作用概述

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

Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发

        Mina最主要的工作就是把底层传输的字节码转换为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层之间的一层,
2.IOFilter的作用 :对应用程序和网络这块的传输,就是二进制数据和对象直接的相互转化 ,有相应的解码和编码器。这也是我们过滤器的一种。

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

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值