1.mina在程序中处于什么样的地位
主要屏蔽了网络通信中的一些细节,对socket进线封装,并且是NIO的一个实现架构,可以帮助我们快速的开发网络通信。
2.IOService接口
用于描述我们的客户端和服务器端接口,其子类是connector和Accptor,分别用于描述我们的客户端和服务端。
IOproceser多线程环境来处理我们的连接请求流程。
IOFilter 提供数据的过滤工作:包括编解码器,日志等信息的过滤。
Hanlder 就是我们的业务对象,自定义的handler需要实现IOHandleAcceptor。
3.大致Mina类的内部结构
1.Processor :是以NIO为基础实现的以多线程的方式来完成我们的读写操作。
Processor的作用:是为我们的Filter读写原始数据的多线程环境,如果Mina自己不去实现的话,我们自己来实现NIO的话,需要自己写一个非阻塞读写的多线程环境。
配置Processor的多线程环境
1)通过 NiosocketAccept(int processor)构造函数可以指定多线程的个数。
2)通过NioSocketConnector(int processor)构造函数也可以指定多线程的个数
IOBuffer:是基于javaNio中的Bytebuffer做了一个封装,用于操作缓冲区中的数据,包括基本的数据类型以及字节数组和一些对象。其本质就是一个可动态扩展的Byte数组。
1.IOBuffer的索引属性:
Capacity:代表了当前缓冲区的大小
Position:理解成当前读写位置,也可以理解成下一个数据单元可读数据单元的位置 Position<=Capacity的时候可以完成数据的读写操作。
Limit:就是下一个不可以被读写缓冲区单元的位置。往往Limit是<=Capacity
3.IOBuffer的常用API
1)static allocate(int capacity)通过静态直接通过类名开辟已指定的缓冲区的空间
2)setAutoExpand(boolean autoExpand) 可以设置是否支持动态的扩展
3)putShort(int index,short value)
putString(CharSequence val,CharsetEncoder encoder),putInt(int value)等等方法实现往缓冲区中放入数据
4)flip:就是让我们的position limit等于当前的position的位置,让我们的position等于0,为我们的读取缓冲区的数据做好准备,因为有时候Limit 不等于 position。一般在发送数据之前调用。
5)hasRemaining是判断缓冲区中是否有数据,boolean值是关于position这个属性是否<=limit 有数据的时候是小于返回true
remaining():返回的是缓冲区中可读取得数据的大小,limit-position的值。
6)Rest和clear
Rest():实现清空数据 Clear():实现数据的覆盖,position=0,重新开始读我们缓冲区的数据。
/-------------------------------------------------------------------------------------------------------------------------------------------------------------------/
1.自定义的编解码工厂:要实现编解码工厂就要实现ProtocolCodecFactory这个接口。
2.实现我们自定义的编解码器,
1)实现自定义的解码器:实现protocolDecoder接口
2)实现自定义的编码器:实现ProtocolEncoder接口
为什么要使用自定义的编码器,因为工作中往往不是通过一个字符串来传输所有所有信息的。我们传输的是自定义的协议包,并且能够在应用程序和网络通信中存在对象和二进制之间的转化关系。所以我们需要结合业务编写自定义的编码器。
常用的自定义方式:
1)定长的方式 Aa , bb ,cc 等这样的通信方式
2)定界符:helloworld| watch men通过特殊的符号来区别消息,这样的方式会出现粘包,半包等现象。
Hello world|watchmen 带来了不正确的消息。
3)包头
包体
包头(length ,flag)包括:数据包的版本号flag,已经整个数据包的(包头+包体)长度
包体(content):实际数据