netty 数据包分包解码问题

问题描述

有谁精通netty ,数据包解码是,不确定数据包大小,怎么能收到完整的数据包?

解决方案

我有个程序的包结构是这样的:1byte(包类型)+4byte(包体长度)+实际包体,于是写了下面的代码:public class ReceivingPacketHandler extends FrameDecoder { public static fianl int HEADER_SIZE=5;@Overrideprotected Object decode(ChannelHandlerContext ctx, Channel channel,ChannelBuffer buf) throws Exception {if (buf.readableBytes() < HEADER_SIZE) {// The header length field was not received yet - return null.return null;}buf.markReaderIndex();// Read protocol headerbuf.readByte();// Read the data length field.int length = buf.readInt();buf.resetReaderIndex();// Make sure if there's enough bytes in the buffer.int totalLength = length + HEADER_SIZE;if (buf.readableBytes() < totalLength) { //the whole packet was not received yet - return null.return null;}Packet recievedPacket = new Packet(size >= 0 ? size : bufSize);recievedPacket.clear();recievedPacket.readPacket(buf, totalLength);return recievedPacket;}}
解决方案二:
不确定包体的大小,可以采用header-content的方式,在header中标示真实包体的长度,类似http1.0协议中的content-length。具体可以参照netty中的objectencoder,首先长度位用4个字节占位待所有的内容写完再讲真实的长度写会长度占位
解决方案三:
我写过一系列的文章,对netty的源码研究过,http://asialee.iteye.com/blog/1769508,不知道对lz会不会有帮助,其中的DelimiterBasedFrameDecoder、LengthFieldBasedFrameDecoder、FrameDecoder希望对lz有所帮助。
解决方案四:
这个跟是不是用netty没有关系,牵涉到网络通信的地方都需要进行协议的制定。一般来说有如下几个点:1、结构定义:magicNumber+packageLength+自定义字段+消息内容+校验码2、粘包处理:解包的时候,先查找magicNum的位置,然后开始读取包长度,解析出有用的消息内容。如果接受的数据不足以刚好解出完整个数的数据包,把剩余的数据放到缓存,等下次接受数据之后拼接起来继续解包。把上面两个做好就可以了。
解决方案五:
这个和是否是netty没有关系,基于TCP的通信必须要有一定的规范,通常会在包头定义包的长度,你可以根据长度readFully读出整个包

时间: 2024-11-03 03:41:15

netty 数据包分包解码问题的相关文章

基于数据包分析的大数据技术解决网络安全问题

1.网络攻击简介 网络攻击是利用网络存在的漏洞和安全缺陷对网络系统的硬件.软件及其系统中的数据进行的攻击.网络信息系统所面临而对威胁来自很多方面,而且会随着时间的变化而变化.从宏观上看,这些威胁可分为人为威胁和自然威胁. 自然威胁来自于各种自然灾害.恶劣的场地环境.电磁干扰.网络设备的自然老化等.这些威胁是无目的性的,但会对网络通信系统造成损害,威胁通信安全. 而人为威胁是对网络信息系统的人为攻击,通常是通过寻找系统的弱点,以非授权方式达到破坏.欺骗和窃取数据信息等目的.两者相比,精心设计的人为

MYSQL CLENT/SERVER数据包传输及net packet buffer作用解析

原创:转载请说明出处 水平有限再加上源码的复杂性,难免出现错误,请共同研究予以纠正 本文参考源码: Net_serv.cc(主要参考) Mysql.h.pp Mysql_socket.h Violite.h Viosocket.c Vio.c 参考书籍: 深入理解MYSQL核心技术 MYSQL核心内幕 internals-en MYSQL官方手册 LINUX系统编程手册 注意:    1.本文将主要解析非压缩MYSQL NET包,而尽量不考虑压缩的MYSQL NET包来减小难度    2.本文主

H264的RTP负载打包的数据包格式,分组,分片

H264的RTP负载打包的数据包格式,分组,分片   1.    RTP数据包格式 RTP报文头格式(见RFC3550 Page12):     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 12 3 4 5 6 7 8 9 0 1   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    |V=2|P|X| CC   |M|     PT     |       seque

Linux防火墙数据包捕获模块

一.防火墙概述 网络防火墙技术是一种用来加强网络之间访问控制,防止外部网络用户以非法手段通过外部网络进入内部网络,访问内部网络资源,保护内部网络操作环境的特殊网络互联设备.它对两个或多个网络之间传输的数据包按照一定的安全策略来实施检查,以决定网络之间的通信是否被允许,并监视网络运行状态. 根据防火墙所采用的技术不同,可以将它分为四种基本类型:包过滤型.网络地址转换-NAT.代理型和监测型.包过滤型产品是防火墙的初级产品,其技术依据是网络中的分包传输技术.包过滤技术的优点是简单实用,实现成本较低

最新的 ffmpeg 2.8 其实连yuy2数据包都不能正确转换

问题描述 最新的 ffmpeg 2.8 其实连yuy2数据包都不能正确转换 说了你也不相信,我用 directx 采集到的数据是从web camera来的 yuy2 数据,我用自己写的转换程序可以成功转换正确的图像rgb24, yuy2 -> rgb24 -> I420 都可以,但是用ffmpeg的sws__scale 怎么也无法正确转换. sws__scale 的解码过程如下 void scaleYUY2toI420(const void *pSrc, int widthSrc, int h

使用 Linux tracepoints, perf以及eBPF跟踪网络数据包的流程

本文讲的是使用 Linux tracepoints, perf以及eBPF跟踪网络数据包的流程,我寻找一个低级Linux网络调试工具已经有一段时间了, Linux允许使用虚拟接口和网络命名空间的组合在主机上直接运行复杂网络.当出现问题时,排除故障相当耗时.如果这是L3路由器的问题,可以使用mtr命令进行路由分析.但是,如果这是一个较低级别的问题,我通常会手动检查每个接口.桥接.网络命名空间以及防火墙,并启动几个tcpdump,以便了解发生了什么.这个过程是如此复杂,以至于我想要找到一个可以直接发

《Ext JS 4 First Look》翻译之二:全新的数据包

第二章 全新的数据包      Extjs 4引入新的数据包,其中新增了不少新类并对旧有的类作出了修整.使数据包更强大和更容易使用.  本章我们将学习一下内容: 2.1. 概述新特性 2.2. 新Model类       2.2.1. 字段声明 2.2.2. 合法性验证 2.2.3. 通过proxies和stores加载和保存数据 2.2.4. 通过关联(associations)建立model间的联系       2.2.4.1. 使用Ext.data.Model.hasMany属性来建立一对

《精通Wireshark》—第1章1.4节通过Wireshark进行数据包分析

1.4 通过Wireshark进行数据包分析 数据包分析(也称为数据包嗅探或协议分析)的作用是抓取在网络(以太网或WiFi)传输中的数据包,并且对其中的信息进行解答的过程,其目的在于了解网络中正在发生的情况.数据包分析需要借助像Wireshark这样的协议分析软件来实现,这些软件可以在互联网上进行下载.其中有些软件是免费的,也有一些软件需要付费才能用于商业目的.在本书中,我们会使用Wireshark来进行网络分析.Wireshark是一款开源软件,同时也是互联网上最优秀的免费网络分析软件. 在当

《Wireshark数据包分析实战(第2版)》—第3章3.4节Wireshark初步入门

3.4 Wireshark初步入门当你成功地在你的系统中装好了Wireshark,你就可以开始熟悉它了.当你终于打开了这个功能强大的数据包嗅探器,却会发现你什么都看不见! 好吧,Wireshark在刚打开的时候确实不太好玩,只有在拿到一些数据之后事情才会变得有趣起来. 3.4.1 第一次捕获数据包为了能让Wireshark得到一些数据包,你可以开始你的第一次数据包捕获实验了.你可能会想:"当网络什么问题也没有的时候,怎么能捕获数据包呢?" 首先,网络总是有问题的.如果你不相信,那么你去