偏执无明 2019-08-16 17:24 采纳率: 0%
浏览 598

netty服务端接收报文由于客户端计算长度错误阻塞在decoder中

代码是这个逻辑,传输内容的前8位代表长度,获取长度后,在收到信息的长度等于获取到的内容长度时。将信息添加处理。但是如果客户端调用时计算长度错误,就会在这里阻塞。这个情景使用IdleStateHandler 时无法进行超时处理的。该如何才能够设置这个超时呢。

protected void decode(ChannelHandlerContext context, ByteBuf byteBuf, List<Object> list) {

        int length = byteBuf.readableBytes();
        if(length==0)
            return;
        byte[] message = new byte[length];
        byteBuf.readBytes(message);
        if (content != null) {
            System.arraycopy(message,0,content,receiveLength+8,length);
        }
        receiveLength  +=length;
        //如果还没获取总长度
        if (xmlLength == 0) {
            byte[] l= Arrays.copyOf(message,8);
            xmlLength = Integer.parseInt(new String(l));
            content=new byte[xmlLength+8];
            System.arraycopy(message,0,content,0,length);
        }
        if (xmlLength == receiveLength) {
            //将报文信息打印到控制台查看
            if(content!=null) {
                String recv = new String(content, StandardCharsets.UTF_8);
                log.info("收到报文:" + recv);
                log.info("总长度:[" + xmlLength + "] 接收长度:[" + receiveLength + "]");
                list.add(recv);
            }
        }
    }
  • 写回答

1条回答 默认 最新

  • 关注

    你所谓的计算长度错误是什么意思?长度太长导致一直等待读取接收内容?如果是这样你应该是知道长度大概的多长的吧,如果读取长度太长,直接把这个连接关闭呗,直接context.close()关闭。还有就是你这个报文没有定义消息头嘛,你怎么知道前8位就一定是数据长度。

    评论

报告相同问题?

悬赏问题

  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿