开发者社区> 问答> 正文

netty 多线程传输518大小数据 出现数据错乱问题

最近做项目遇到一个问题,就是netty开发程序,客户端发送0518xxxx(后面518个数据),然后发送给服务端,服务端的解码器是自己写的,大概意思就是读取长度,再根据长度去截取,不够长度时累计到下次读取,我发现这个方法单线程没有问题,多线程或出现数据错乱的问题呢,请问大家这个问题要怎么解决。以下是我服务端的解码器:

public class MsgDecoder extends FrameDecoder { 

@Override
  protected Object decode(ChannelHandlerContext ctx, Channel channel,
    ChannelBuffer buf) throws Exception { 

  
   if (buf.readableBytes() < 4) {
    return null;
   }
   buf.markReaderIndex();
   byte[] headBytes = new byte[4];
   buf.readBytes(headBytes);
   String lenStr = new String(headBytes, "gbk");
   int length = Integer.parseInt(lenStr);
   if (length < 4 || length > maxFrameLength) {
    throw new RuntimeException("Bad message length: " + length);
   }
   if (buf.readableBytes() < length) {
    buf.resetReaderIndex();
    System.out.println("长度不够");
    return null;
   } 

  ChannelBuffer frame = buf.readBytes(length);
   String msgStr = frame.toString(Charset.forName("gbk"));
   //System.out.println("decoder:"+msgStr);
   return msgStr;
   
  } 

 } 

展开
收起
爵霸 2016-06-02 09:38:43 3606 0
1 条回答
写回答
取消 提交回答
  • 感觉和线程没有关系! 本质上没有好处理数据粘包。 直接用 int toString 这个不科学。0000-9999的数字。 后面readByte(99) 这样就可以返回对应长度的数据了吗? buf.readableBytes()

    手机端不能使用 < 符号呀,。后面的内容都被替换掉了

    2019-07-17 19:24:00
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载