一种避免数据粘包的处理装置及方法 技术领域 本发明涉及计算机应用领域中数据传输技术, 尤其涉及避免数据传输过程中出现 数据粘包的处理装置及方法。
背景技术 随着计算机和通讯技术的不断发展, 计算机与通讯线路及设备结合起来实现人与 计算机、 计算机与计算机 (M2M, Machine-to-Machine) 之间的数据通讯, 不仅使各用户计算 机的利用率大大提高, 而且极大地扩展了计算机的应用范围, 并可使各用户实现计算机软 硬件资源与数据资源的共享。对计算机的远距离实时控制和对数据的远距离收集等工作, 也都可以利用数据通讯来实现。
在数据通讯的过程中, 由于通道的阻塞等多方面的原因都会出现接收数据粘包的 现象。粘包是指发送方发送的若干包数据, 到接收方接收时被粘成一个包。通常, 数据粘包 的情况有两种, 一种是粘在一起的数据包都是完整的数据包, 另一种情况是粘在一起的数
据包中有不完整的数据包。
以往针对数据粘包的解决方法一般采用短连接的方式, 该方式适合单条数据的交 互, 并且该方式会使得通讯效率降低。当在一去多回的数据交互方式下出现数据粘包现象 时, 通常用该方式会放弃一些数据。因此, 该方式在串口通讯和有线通讯上尚可使用, 但在 无线通讯这种按流量计费的方式下则无法使用。
综上所述可知, 需要一种既能使用在无线通讯上节约成本同时又能提高通讯效率 的避免数据粘包的处理方法。 发明内容 本发明所要解决的技术问题是提供一种处理数据粘包的方法及装置, 能够保证数 据完整性并方便地应用在无线通讯上。
为了解决上述技术问题, 本发明提供了一种避免数据粘包的处理装置, 包括数据 接收模块、 缓存模块以及数据提取模块, 其中 :
数据接收模块, 用于在缓存模块的数据写锁打开时, 将接收的数据写入缓存模块 的空闲空间内, 并控制数据读锁打开 ;
缓存模块, 用于内置互斥的数据写锁和所述数据读锁, 并向数据接收模块提供缓 存数据的缓存空间 ;
数据提取模块, 用于在缓存模块的数据读锁打开时, 从缓存模块的缓存数据空间 提取完整的数据, 并控制数据写锁打开。
进一步地,
缓存模块提供的缓存空间, 至少要能保存数据传输协议所规定的最大数据长度的 4 至 8 条数据。
进一步地,
数据接收模块在向缓存模块写入数据时, 根据数据传输协议的固定位置获取接收 数据的长度信息, 根据该长度信息从由第一标识标记的空闲空间的起始地址开始写入接收 的全部数据, 并将该第一标识置为写入接收的全部数据的下一位地址 ;
数据提取模块在从缓存模块提取数据时, 根据接收数据的长度信息从由第二标识 标记的缓存数据空间的起始地址开始提取完整的数据, 并将该第二标识置为提取完整的数 据的下一位地址。
进一步地,
数据接收模块在缓存模块从由第一标识标记的起始地址开始到缓存结尾的空闲 空间不足以写入接收的全部数据时, 根据数据的长度信息先从由第一标识标记的起始地址 开始写入数据, 并将剩余的数据写入到缓存模块起始的空闲空间, 然后将第一标识更新为 写入接收的全部数据的下一位地址 ;
数据提取模块在缓存模块从由第二标识标记的起始地址开始到缓存结尾的缓存 数据空间不足以提取完整的数据时, 根据数据的长度信息先从由第二标识标记的起始地址 开始提取数据, 并将剩余的缓存数据从缓存模块起始的缓存数据空间中提取, 然后将第二 标识更新为提取完整的数据的下一位地址。
为了解决上述技术问题, 本发明提供了一种避免数据粘包的处理方法, 涉及数据 接收线程和数据提取线程, 该方法包括 :
数据接收线程在缓存的数据写锁打开时, 将接收的数据写入缓存的空闲空间内, 并控制数据读锁打开 ; 和 / 或数据提取线程在缓存的数据读锁打开时, 从缓存的数据空间 提取完整的数据, 并控制数据写锁打开。
进一步地, 缓存提供的缓存空间, 至少要能保存数据传输协议所规定的最大数据 长度的 4 至 8 条数据。
进一步地, 数据接收流程将接收的全部据写入缓存的空闲空间内, 具体包括 :
根据数据传输协议的固定位置获取接收数据的长度信息, 根据该长度信息从由第 一标识标记的空闲空间的起始地址开始写入接收的全部数据, 并将该第一标识置为写入接 收的全部数据的下一位地址。
进一步地, 数据提取线程从缓存的数据空间提取完整的数据, 具体包括 :
根据接收数据的长度信息从由第二标识标记的缓存数据空间的起始地址开始提 取完整的数据, 并将该第二标识置为提取完整的数据的下一位地址。
进一步地,
当数据接收线程在所述缓存从由第一标识标记的起始地址开始到缓存结尾的空 闲空间不足以写入接收的全部数据时, 根据接收数据的长度信息先从由第一标识标记的起 始地址开始写入数据, 并将剩余的数据写入到缓存起始的空闲空间, 然后将第一标识更新 为写入接收的全部数据的下一位地址。
进一步地,
当数据提取线程在缓存从由第二标识标记的起始地址开始到缓存结尾的缓存数 据空间不足以提取完整的数据时, 根据接收数据的长度信息先从由第二标识标记的起始地 址开始提取数据, 并将剩余的缓存数据从缓存起始的缓存数据空间中提取, 然后将第二标 识更新为提取完整的数据的下一位地址。本发明提供的避免数据粘包的处理装置及方法, 能够在保证数据完整性的前提下 提高了通讯效率, 同时又方便地使用在无线通讯上, 从而节约了系统成本。 附图说明 图 1 为本发明的处理数据粘包的装置实施例的结构示意图 ;
图 2 为本发明当缓存剩余空闲空间长度小于接收的数据容量时写入缓存的方法 实施例示意图 ;
图 3 为本发明当缓存剩余的缓存数据空间长度小于提取的数据容量时从缓存提 取数据的方法实施例示意图。
具体实施方式
以下结合附图和优选实施例对本发明的技术方案进行详细地阐述。应该理解, 以 下例举的实施例仅用于说明和解释本发明, 而不构成对本发明技术方案的限制。
本发明提供的处理数据粘包的装置实施例, 其结构如图 1 所示, 包括数据接收模 块、 缓存模块以及数据提取模块, 其中 : 数据接收模块, 用于在缓存模块的数据写锁打开时, 将接收的数据写入缓存模块 的空闲空间内, 并控制数据读锁打开 ;
缓存模块, 用于内置互斥的数据写锁和数据读锁, 并向数据接收模块提供缓存数 据的空闲空间 ;
数据提取模块, 用于在缓存模块的数据读锁打开时, 从缓存模块缓存数据空间提 取完整的数据, 并控制数据写锁打开。
在上述装置实施例中,
缓存模块提供的缓存空间, 至少要能保存数据传输协议所规定的最大数据长度的 多条数据。
譬如, 数据传输协议规定的数据长度有 8 字节、 16 字节以及 32 字节, 则缓存模块提 供的缓存空间至少保存该数据传输协议所规定的最大的 32 字节数据长度的 4 至 8 条数据。
在上述装置实施例中,
数据接收模块在向缓存模块写入数据时, 根据数据传输协议的固定位置获取接收 数据的长度信息, 根据该长度信息从由第一标识标记的空闲空间的起始地址开始写入接收 的全部数据, 并将该第一标识置为写入接收的全部数数据的下一位地址 ;
数据提取模块在从缓存模块提取数据时, 根据数据的长度信息从由第二标识标记 的缓存数据空间的起始地址开始提取完整的数据, 并将该第二标识置为提取完整的数据的 下一位地址。
在上述装置实施例中,
数据接收模块在缓存模块从由第一标识标记的起始地址开始到缓存结尾的空闲 空间不足以写入接收的全部数据时, 根据数据的长度信息先从由第一标识标记的起始地址 开始写入数据, 并将剩余的数据写入到缓存模块起始的空闲空间 ( 注意, 此时数据提取模 块已经将数据提取, 使得缓存的开始部分已经空闲 ), 然后将第一标识更新为写入接收的全 部数据的下一位地址。
例如, 数据接收模块接收到一个具有 8 个字节长度的数据, 而从由第一标识标记 的空闲空间的起始地址开始到缓存结尾只有 5 个字节, 则先将接收的 5 个字节的数据写入 这 5 个字节中, 并将剩余的 3 个字节的数据写入缓存模块起始的 3 个空闲空间中, 然后将第 一标识更新为写入数据的下一位地址, 如图 2 所示。
同理, 数据提取模块在缓存模块从由第二标识标记的起始地址开始到缓存结尾的 缓存数据空间不足以提取完整的数据时, 根据数据的长度信息先从由第二标识标记的起始 地址开始提取数据, 并将剩余的缓存数据从缓存模块起始的缓存数据空间中提取, 然后将 第二标识更新为提取完整的数据的下一位地址, 如图 3 所示。
本发明针对上述装置实施例, 相应地还提供了避免数据粘包的处理方法实施例, 涉及数据接收线程和数据提取线程, 该方法包括 :
数据接收线程在缓存的数据写锁打开时, 将接收的数据写入缓存的空闲空间内, 并控制数据读锁打开 ; 和 / 或数据提取线程在缓存的数据读锁打开时, 从缓存的数据空间 提取完整的数据, 并控制数据写锁打开。
在上述方法实施例中,
缓存提供的缓存空间, 至少要能保存数据传输协议所规定的最大数据长度的多条 数据。 在上述方法实施例中,
数据接收流程将接收的全部数据写入缓存的空闲空间内, 具体包括 :
根据数据传输协议的固定位置获取接收数据的长度信息, 根据该长度信息从由第 一标识标记的空闲空间的起始地址开始写入接收的全部数据, 并将该第一标识置为写入接 收的全部数据的下一位地址。
在上述方法实施例中,
数据提取线程从缓存的数据空间提取完整的数据, 具体包括 :
根据数据的长度信息从由第二标识标记的缓存数据空间的起始地址开始提取完 整的数据, 并将该第二标识置为提取完整的数据的下一位地址。
在上述方法实施例中,
数据接收线程在缓存从由第一标识标记的起始地址开始到缓存结尾的空闲空间 不足以写入接收的全部数据时, 根据数据的长度信息先从由第一标识标记的起始地址开始 写入数据, 并将剩余的数据写入到缓存起始的空闲空间, 然后将第一标识更新为写入接收 的全部数据的下一位地址。
在上述方法实施例中,
数据提取线程在缓存从由第二标识标记的起始地址开始到缓存结尾的缓存数据 空间不足以提取完整的数据时, 根据数据的长度信息先从由第二标识标记的起始地址开始 提取数据, 并将剩余的缓存数据从缓存起始的缓存数据空间中提取, 然后将第二标识更新 为提取完整的数据的下一位地址。
本发明的上述装置实施例和方法实施例, 在能够确保数据的完整性的前提下, 提 高了通讯效率, 同时又方便地使用在无线通讯上, 从而节约了系统成本。
对于本领域的专业人员来说, 在了解了本发明内容和原理后, 能够在不背离本发 明的原理和范围的情况下, 根据本发明的方法进行形式和细节上的各种修正和改变, 但是
这些基于本发明的修正和改变仍在本发明的权利要求保护范围之内。