mina使用介绍

2016-04-17 20:56:00
admin
原创 2979
摘要:mina使用介绍

一、mina使用介绍

1、官方文档:https://mina.apache.org/mina-project/documentation.html

2、NioSocketAcceptor使用一个线程监听请求,建立一个连接会创建一个NioSocketSession;

3、NioSocketConnector使用一个线程建立连接,建立一个连接会创建一个NioSocketSession;

4、NioSocketAcceptor包含一个SimpleIoProcessorPool,默认包含CPU核数+1个NioProcessor;

5、NioSocketConnector包含一个SimpleIoProcessorPool,默认包含CPU核数+1个NioProcessor;

6、NioProcessor使用一个线程处理网络数据收发,NioSocketSession被分配给一个NioProcessor

7、IoService不指定数据编码过滤器,IoHandler收到消息类型会是IoBuffer;

8、org.apache.mina.filter.firewall.Subnet,用于表示网段信息CIDR;

9、org.apache.mina.util.ExpiringMap,实现了Map接口,支持数据过期;


UDP使用介绍:

1、UDP特性:不可靠通信,可能丢包,无序到达,不会拆包,单个包最大64K;

2、DatagramSocket作为客户端时,可以指定端口,如不指定则使用随机端口;

3、DatagramSocket.setSoTimeout(int timeout),设置读取数据的超时时间;

4、NioDatagramAcceptor使用一个线程监听请求,建立一个连接会创建一个NioDatagramSession;

5、NioDatagramAcceptor直接在监听线程处理网络数据收发,不使用NioProcessor处理数据收发;

6、NioDatagramAcceptor默认不具备多线程处理能力,多线程处理需要使用ExecutorFilter;

7、NioDatagramAcceptor包含一个IoSessionRecycler,使用一个线程回收空闲会话,默认空闲60秒回收;

8、NioDatagramConnector使用一个线程建立连接,建立一个连接会创建一个NioDatagramSession;

9、NioDatagramConnector包含一个SimpleIoProcessorPool,默认包含CPU核数+1个NioProcessor;


重要配置:

1、IoAcceptor需要处理空闲事件,关闭长时间空闲会话,否则会话可能一直无法关闭;

2、IoConnector.setConnectTimeoutMillis(millis),设置连接超时,默认60秒;

3、IoSessionConfig.setWriteTimeout(sec),设置写操作超时,默认60秒;


常用函数:

1、IoService.dispose(),关闭服务,等待所有会话关闭;

2、IoService.dispose(await),关闭服务,等待所有会话关闭,等待线程池关闭;

3、IoService.setSessionDataStructureFactory(factory),设置会话包含的数据结构的工厂;

4、IoSession.closeNow(),立即关闭会话,是异步操作会返回Future;

5、IoSession.closeOnFlush(),写操作完成才关闭会话,是异步操作会返回Future;

6、IoSession.setAttribute(key,value),设置会话变量,底层使用ConcurrentHashMap;

7、IoSession.getAttribute(key),获取会话变量,底层使用ConcurrentHashMap;

8、IoSession.getFilterChain(),获取过滤器列表,每个会话包含自己的IoFilterChain;


示例代码:

1、minademo.zip

2、MinaTimeServer.javaMinaTimeServerHandler.java

3、MinaTimeClient.javaMinaTimeClientHandler.java

4、UdpServerMina.javaUdpClientMina.java

5、UdpServer.javaUdpClient.java


二、mina使用详解

继承关系:

1、interface IoAcceptor extends IoService

2、interface IoConnector extends IoService

3、class AbstractIoService implements IoService

4、class AbstractIoAcceptor extends AbstractIoService implements IoAcceptor

5、class AbstractIoConnector extends AbstractIoService implements IoConnector

6、interface DatagramAcceptor extends IoAcceptor

7、interface DatagramConnector extends IoConnector


内置过滤器:

1、IoFilter.filterWrite(),发送数据时调用;

2、IoFilter.messageSent(),发送完数据调用

3、LoggingFilter,打印各种事件,可以设置日志级别;

4、BlacklistFilter,设置网络黑名单,可以配置网段或IP;

5、ConnectionThrottleFilter,设置客户端访问间隔,单位毫秒;

6、SessionAttributeInitializingFilter,初始化会话属性,在会话创建阶段执行;

7、BufferedWriteFilter,设置写操作缓存,flush操作立即刷新缓存,默认8192字节;

8、ExecutorFilter,使用线程池执行重度计算任务,默认核心线程0个,默认最大线程16个;


IoBuffer使用介绍:

1、IoBuffer包含两个分配器,SimpleBufferAllocator和CachedBufferAllocator;

2、支持读写字符串,putPrefixedString(str,encoder)和getPrefixedString(decoder);

3、支持缩减空间shrink操作,如果设置了autoShrink,compat操作也会缩减空间;

4、CachedBufferAllocator.maxPoolSize,每个线程每种大小缓存最大个数,默认8个;

5、CachedBufferAllocator.maxCachedBufferSize,单个缓存的最大空间,默认256K;


ProtocolCodecFilter使用介绍:

1、官方文档:https://mina.apache.org/mina-project/userguide/ch9-codec-filter/ch9-codec-filter.html

2、ProtocolCodecFilter避免一个写对应多个receive,避免多个写对应一个receive,保证一个消息一个receive;

3、编码数据长度未知时,可以设置IoBuffer.setAutoExpand(true),自动扩展缓存,避免生成数据缓存失败;

4、IoBuffer.prefixedDataAvailable()函数便于解析定长消息,解码消息状态建议存放在会话变量

5、CumulativeProtocolDecoder帮助解码,他会一直缓存数据,直到数据可以成功解码一个消息;

6、CumulativeProtocolDecoder.doDecode能够解码消息则返回true,数据不足解码则返回false;

7、TextLineCodecFactory消息格式是消息内容+换行符,支持设置消息最大长度,默认1K;

8、PrefixedStringCodecFactory消息格式是消息长度+消息内容,支持设置消息最大长度,默认2K;

9、ObjectSerializationCodecFactory消息格式是序列化对象,支持设置对象类型,支持设置最大对象大小

10、DemuxingProtocolCodecFactory支持多种消息格式,编码通过对象类型路由,解码通过数据内容判断;


KeepAliveFilter使用介绍:

1、messageFactory.getRequest(),是否发起检活请求,返回非空则发起检活请求;

2、messageFactory.isResponse(),是否检活响应报文,返回true则是;

3、getRequest和isResponse组合使用判断对端是否存活,通常用于判断客户端是否存活;

4、interestedIdleStatus=READER_IDLE,requestInterval+requestTimeout对端无响应,则关闭会话;

5、interestedIdleStatus=BOTH_IDLE,requestInterval+2*requestTimeout对端无响应,则关闭会话;

6、messageFactory.isRequest(),是否检活请求报文,返回true则是;

7、messageFactory.getResponse(),获取检活响应报文,返回非空则发起检活响应;

8、isRequest和getResponse组合使用自动响应检活请求,通常用于客户端自动响应;

9、KeepAliveFilter默认拦截所有空闲事件,forwardEvent=true则转发空闲事件给处理器;

发表评论
评论通过审核之后才会显示。