还剩1页未读,继续阅读
文本内容:
平台物联网通信描述公司通信系统架构1目前系统通信框架采用的是流行的netty通信框架,实现原理参考Java AI0NI
0.2特点oAIO方式使用于连接数目多且连接比较长重操作的架构,比如相册服务器,充分调用os参与并发操作,编程比较复杂,JDK7开始支持2使用的解码器LengthFieldBasedFrameDecoderTCP/IP通信方式传输过程中会存在数据粘包及拆包问题,平台为了解决此问题采用了Netty提供的LengthFieldBasedFrameDecoder解码器用于解码止匕类数据包,这个解码器类工作方式如下协议中会携带长度字段,用于标识消息体或者整包消息的长度由于基于长度解码需求的通用性,Netty提供了LengthFieldBasedFrameDecoder,自动屏蔽TCP底层的拆包和粘包问题,只需要传入正确的参数,即可轻松解决读半包”问题我们先来看一下他的构造函数public LengthFieldBasedFrameDecoderByteOrderbyteOrder,int maxFrameLength,int lengthFieldOffset,int lengthFieldLength,int lengthAdjustment,int initialBytesToStrip,boolean failFast{}byteOrder:表示字节流表示的数据是大端还是小端,用于长度域的读取;maxFrameLength:表示的是包的最大长度,超出包的最大长度netty将会做一些特殊处理;lengthFieldOffset:指的是长度域的偏移量,表示跳过指定长度个字节之后的才是长度域;lengthFieldLength:记录该帧数据长度的字段本身的长度;lengthAdjustment:该字段加长度字段等于数据帧的长度,包体长度调整的大小,长度域的数值表示的长度加上这个修正值表示的就是带header的包;initialBytesToStrip:从数据帧中跳过的字节数,表示获取完一个完整的数据包之后,忽略前面的指定的位数个字节,应用解码器拿到的就是不带长度域的数据包;failFast:如果为true,则表示读取到长度域,TA的值的超过maxFrameLength,就抛出一个TooLongFrameException,而为false表示只有当真正读取完长度域的值表示的字节之后,才会抛出TooLongFrameException,默认情况下设置为true,建议不要修改,否则可能会造成内存溢出LengthFieldBasedFrameDecoder定义了一个长度的字段来表示消息的长度,因此能够处理可变长度的消息将消息分为消息头和消息体,消息头固定位置增加一个表示长度的字段,通过长度字段来获取整包的信息.通信目前存在的问题3平台目前多数情况下通信一直正常工作,但是偶尔会出现以下问题,一个正常的数据包0ff05568010009033d010000ffb22a会发生拆包现象,分成两次发送到服务器端OffO--5568010009033d010000ffb22a,由于平台数据采集方式目前采用的是终端主动上传的方式,这种拆包后的末端的数据可能被放在后上传的数据包后面被平台解析,例如(0ff05568010009033d010000ffb22a数据包在发生拆包后拆包成)OffO--5568010009033d010000ffb22a,后面还有一个数据包这时候被终端主动上传,会出现一个现象服务器端接收的数据OffO————5568010009033d010000ffb22a,这样结合上面第二条描述的平台使用的解码器,平台在读取数据包长度字段的时候就认为该包为不符合协议规定的包从而报错。
个人认证
优秀文档
获得点赞 0