首页>代码>Netty基于DTU协议操作字节序之服务端、客户端、websocket客户端源码实现>/springboot-netty-dtu-client/src/main/java/com/example/im/codec/ByteArrayDecoder.java
package com.example.im.codec;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.example.instant.ProtoInstant;
import com.example.util.CharacterConvert;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

/**
 * byte     1字节    (8位) -27~27-1 0 Byte 255              
 * short    2字节    (16位) -215~215-1 0 Short         
 * int      4字节    (32位) -231~ 231-1 0 Integer           
 * long     8字节    (64位) -263~263-1 0 Long          
 * char     2字节    (C语言中是1字节)可以存储一个汉字
 * float    4字节    (32位) -3.4e+38 ~ 3.4e+38 0.0f Float           
 * double   8字节    (64位) -1.7e+308 ~ 1.7e+308 0 Double
 * char 2字节(16位) u0000~uFFFF(‘’~‘?’) ‘0’ Character (0~216-1(65535))  
 * 布尔 boolean 1/8字节(1位) true, false FALSE Boolean 
 * C语言中,short、int、float、long、double,分别为:1个、2个、4个、8个、16个
 * 对数组进行解码
 * @author 关注微信公众号:程就人生,获取更多源码
 * @date 2020年8月3日
 * @Description 
 *
 */
public class ByteArrayDecoder extends ByteToMessageDecoder{

	private static Logger log = LoggerFactory.getLogger(ByteArrayDecoder.class);
	
	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
		// 标记一下当前的readIndex的位置
		in.markReaderIndex();
		//判断获取到的数据是否够字头,不沟通字头继续往下读
		//字头:1位,数据串总长度:2位
		if(in.readableBytes() < ProtoInstant.FILED_LEN){
			log.info("不够包头,继续读!");
			return;
		}
		//读取字头1位
		int fieldHead = CharacterConvert.byteToInt(in.readByte());
		if(fieldHead != ProtoInstant.FIELD_HEAD){
			String error = "字头不对:" + ctx.channel().remoteAddress();
			log.info(error);
			ctx.close();
			return;
		}
		//长度2位,读取传送过来的消息的长度。
		int length = CharacterConvert.shortToInt(in.readShort());
		// 长度如果小于0
		if (length < 0) {// 非法数据,关闭连接
			log.info("数据长度为0,非法数据,关闭连接!");
			ctx.close();
			return;
		}		
		// 读到的消息体长度如果小于传送过来的消息长度,减去字头1位,数据长度2位
		int dataLength = length - ProtoInstant.FILED_LEN;
		if (dataLength > in.readableBytes()) {
			// 重置读取位置
			in.resetReaderIndex();
			return;
		}
		byte[] array;
		if (in.hasArray()) {
			log.info("堆缓冲");
			// 堆缓冲
			ByteBuf slice = in.slice();
			array = slice.array();			
		} else {
			log.info("直接缓冲");
			// 直接缓冲
			array = new byte[dataLength];
			in.readBytes(array, 0, dataLength);
		}
		if(array.length > 0){
			in.retain();
			out.add(array);	
		}
	}
}
最近下载更多
shenmofeng11  LV1 2022年12月8日
xiaoche117  LV17 2022年9月15日
mtx147369  LV1 2022年8月10日
xujiaheng  LV2 2022年5月30日
jaonsang  LV25 2022年4月8日
18513928828  LV1 2021年8月9日
崔春晓 2021年7月19日
暂无贡献等级
jacco_su  LV1 2021年4月19日
chltiger  LV3 2021年4月12日
396957748  LV1 2021年3月8日
最近浏览更多
18728748707  LV13 5月9日
流水本无情  LV9 3月13日
内心向阳  LV4 2023年11月8日
zgbi2008  LV1 2023年4月11日
shenmofeng11  LV1 2022年12月8日
wz520135  LV7 2022年10月16日
crosa_Don  LV18 2022年10月7日
xiaoche117  LV17 2022年9月15日
adimgaoshou  LV10 2022年9月6日
mtx147369  LV1 2022年8月10日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友