private List<byte[]> getCompletePacket(byte[] bytes, ByteBuf byteBuf) {
byte[] clone = bytes.clone();
int i = 0;
List<byte[]> ret = Lists.newArrayList();
while (i + YTLConstant.HEADER_LENGTH < clone.length) {
byte[] header = Arrays.copyOfRange(clone, i, YTLConstant.HEADER_LENGTH);
if (Arrays.equals(header, YTLConstant.ELECTRICITY_METER_RECEIVE_HEADER)
|| Arrays.equals(header, YTLConstant.RELAY_SETTING_RECEIVE_NORMAL_HEADER)
|| Arrays.equals(header, YTLConstant.RELAY_SETTING_RECEIVE_WRONG_HEADER)
|| Arrays.equals(header, YTLConstant.RELAY_STATUS_RECEIVE_HEADER)) {
//读取电表 接收数据 头
if (YTLConstant.HEADER_LENGTH + 1 < clone.length) {//加1为了判断长度位
byte infoLength = clone[YTLConstant.HEADER_LENGTH];
int tailIndex = YTLConstant.HEADER_LENGTH + infoLength + 2;//CRC长度为2
if (tailIndex <= clone.length - 1 && bytes[tailIndex] == YTLConstant.TAIL) {
i = tailIndex + 1;
if (i == clone.length) {
ret.add(bytes);
byteBuf.skipBytes(i);
} else {
ret.add(Arrays.copyOf(clone, i));//从clone中截取长度为i的数组
clone = Arrays.copyOfRange(clone, i, clone.length - 1);
byteBuf.skipBytes(i);
i = 0;
}
}else{
//无效指令跳过
byteBuf.skipBytes(clone.length);
break;
}
}
}else{
//无效指令跳过
if (logger.isDebugEnabled()) {
logger.debug("Received an unregistered cmd,the header is : "+Arrays.toString(header));
}
byteBuf.skipBytes(clone.length);
break;
}
}
return ret;
}

netty tcp拆包的更多相关文章

  1. Netty系列(四)TCP拆包和粘包

    Netty系列(四)TCP拆包和粘包 一.拆包和粘包问题 (1) 一个小的Socket Buffer问题 在基于流的传输里比如 TCP/IP,接收到的数据会先被存储到一个 socket 接收缓冲里.不 ...

  2. Netty处理TCP拆包、粘包

    Netty实践(二):TCP拆包.粘包问题-学海无涯 心境无限-51CTO博客 http://blog.51cto.com/zhangfengzhe/1890577 2017-01-09 21:56: ...

  3. Netty—TCP的粘包和拆包问题

    一.前言 虽然TCP协议是可靠性传输协议,但是对于TCP长连接而言,对于消息发送仍然可能会发生粘贴的情形.主要是因为TCP是一种二进制流的传输协议,它会根据TCP缓冲对包进行划分.有可能将一个大数据包 ...

  4. Netty TCP 通信失败

    前段时间,在搞Netty TCP 通信,踩了一些坑,今天就在这篇总结一下 Netty通信失败原因 Netty TCP 通信失败的可能原因: 1.服务端或客户端,其中一端没有正常启动 2.是否在正确的位 ...

  5. netty网络通信中的tcp拆包问题

    工作中的一个项目,我们的一个应用与银行系统进行tcp通信的时候,银行下送的报文有时会分多次返回.在tcp中这种数据包分多次小数据包发送的情况成为拆包问题. 其中一个,也是最常见的思路就是在报文的报文头 ...

  6. Netty TCP粘包/拆包问题《一》

    1.使用LineBasedFrameDecoder,StringDecoder解析器进行解决TCP粘包/拆包问题 2.代码搞起: TimeClient:客户端 /* * Copyright 2013- ...

  7. 深入了解Netty【八】TCP拆包、粘包和解决方案

    1.TCP协议传输过程 TCP协议是面向流的协议,是流式的,没有业务上的分段,只会根据当前套接字缓冲区的情况进行拆包或者粘包: 发送端的字节流都会先传入缓冲区,再通过网络传入到接收端的缓冲区中,最终由 ...

  8. 架构师养成记--20.netty的tcp拆包粘包问题

    问题描述 比如要发ABC DEFG HIJK 这一串数据,其中ABC是一个包,DEFG是一个包,HIJK是一个包.由于TCP是基于流发送的,所以有可能出现ABCD EFGH 这种情况,那么ABC和D就 ...

  9. Netty TCP粘包/拆包问题《二》

    1.DelimiterBasedFrameDecoder:是以分隔符作为结束标志进行解决粘包/拆包问题 代码: EchoClient:客户端 /* * Copyright 2012 The Netty ...

随机推荐

  1. 不常用但很有用的git show 和 git blame

    团队使用git 合作时,可能遇见想要查看一段比较难以阅读代码, 此时可能需要联系最新的修改者是哪位,这时候最有用的最快捷的方法就是git blame 啦, 这个指令的output是一个文件的各个区域段 ...

  2. asp.net 浏览器下载文件的四种方式

    // 方法一:TransmitFile实现下载 protected void Button1_Click(object sender, EventArgs e) { Response.ContentT ...

  3. 温故而知新 Ajax 的新坑 dataType: 'json'

    为了方便实验,我随便捏造了一个json数据,然后放在php中输出. 请求明明是200,json数据也正确,但ajax就是不执行success回调? 原因是 dataType: 'json', 导致的. ...

  4. 摘抄JPA官方文档原文 防呆

    Spring Data JPA - Reference Documentation Oliver GierkeThomas DarimontChristoph StroblMark PaluchVer ...

  5. YMP运行初始化步骤

    , Version.VersionType.Release); private static final Log _LOG = LogFactory.getLog(YMP.class); privat ...

  6. 讲讲python“=”运算符上的优雅语法

    心路历程: 之前学linux,虽然学的行算不错,不过总感觉差了点什么,自己找不到也说不出来:直到有一天我看到别人mount上了一个普通文件: 当时给我的感觉这太不可思议了,这个文件又不是块设备:后来脑 ...

  7. Windows Mobile入门

    转自 http://www.cnblogs.com/peterzb/archive/2009/05/12/1455256.html [准备篇]        最近安排做手机视频监控方面开发,这个对我来 ...

  8. JS location.href跳出框架打开新页面

    后面在框架中,当判断登录失效后要返回登录页面,但登录页面却在框架内打开,我想让它直接跳出框架打开,这里不是打开新窗口. echo "<script language=\"ja ...

  9. NGINX宏观手记(变量|配置)

    前言 任何一个工具都有它的灵魂所在,作为一个PHP程序员,我们可能仅仅使用了它的一小部分,这篇文章让你更加了解Nginx,本章大多都是总结.翻译.整理 ,希望你可以知道nginx不仅仅是PHP的附属品 ...

  10. K8S 详细介绍

    k8s的中文文档,参考地址:http://docs.kubernetes.org.cn/227.html