netty传输报文进阶使用LengthFieldBasedFrameDecoder

本文介绍使用Netty进行数据传输时如何解决数据粘连问题,并通过自定义缓存和解析逻辑实现可靠的消息解码。同时探讨了利用Netty插件LengthFieldBasedFrameDecoder简化代码的方法。

netty可以传输报文,为了解决数据粘连,自己费力气写了缓存

private void addCmd(byte[] bytes, byte len1, byte len2, List list) {
        log.debug("Jc5000Service Jc5000Decoder decode jcBuffer.limit  memory ={}",jcBuffer.limit());
        Jc5000Response jc5000Response = new Jc5000Response();
        byte cmdCode = (byte) (bytes[CMD_POS] & 0xff);
        if (log.isDebugEnabled()) {
            log.debug("Jc5000Service Jc5000Decoder decode command is cmdCode=" + cmdCode + "," + Jc5000CommandEnum.getJc5000CommandEnumKeyByCode(cmdCode));
        }
        jc5000Response.setCmdCode(cmdCode);
        jc5000Response.setCommand(Jc5000CommandEnum.getJc5000CommandEnumByCode(cmdCode));
        jc5000Response.setLEN(new byte[]{len1, len2});
        jc5000Response.setBCC(bytes[bytes.length - 2]);
        if (log.isDebugEnabled()) {
            log.debug("Jc5000Service Jc5000Decoder success parse addcmd {}", bytes2HexString(bytes));
        }
        jc5000Response.setDATA(bytes);
        byte reponseFlag = bytes[SUCCESS_POS];
        jc5000Response.setReponseFlag(reponseFlag);
        if (reponseFlag == Constants.SUCCESS) {
            jc5000Response.setIS_SUCCEEDED(true);
            log.info("Jc5000Service Jc5000Decoder cmd  execute success");
            TvmRuntimeCoreDeviceStatusManager.getInstance().setJc5000ReaderStatus(DeviceStatusEnum.NORMAL.getCode());
            TvmRuntimeCoreDeviceStatusManager.getInstance().setJc5000ReaderrCode(StringUtils.EMPTY);
        } else if (reponseFlag == Constants.FAIL) {
            byte[] errorCode = Arrays.copyOfRange(bytes, 5, bytes.length);
            jc5000Response.setErrorcode(errorCode);
            if (errorCode != null && errorCode.length >= 2) {
                jc5000Response.setErrCode(String.format("%02dH", Integer.valueOf(errorCode[1])));
                jc5000Response.setErrUniqueCode(bytes2HexString(new byte[]{errorCode[0],errorCode[1]}));
            }
            log.error("Jc5000Service Jc5000Decoder execute failure , {}",bytes2HexString(bytes));
        }else{
            log.error("Jc5000Service Jc5000Decoder execute ,other failure, result={}", reponseFlag);
        }
        list.add(jc5000Response);
    }

    /**
     * 读取到缓存里所有数据
     */
    public byte[] conver(ByteBuffer byteBuffer) {
        byteBuffer.flip();
        byteBuffer.rewind();
        int len = byteBuffer.limit() - byteBuffer.position();
        byte[] bytes = new byte[l
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值