消息分片传输设计与实现

一、数据发送过程中存在的问题

发送中无法取消文件发送

大文件传输容错率较低

同一连接无法实现文件、普通消息优先级

二、分片数据传输流程

三、分片逻辑实现

根据文件大小计算分片、并读取数据到分片

分片数据固定格式打包发送

分片数据解析与分片组装

Dispatcher调度逻辑调整

四、Packet规则

五、分片消息规则

帧大小 : 最大为2的16次方-1=65535(0占用一个字节,所以最大标识为65535),即帧的大小最大为65535

帧类型 :表明帧是否是首帧(如果为首帧,则根据类型创建对应的帧类型。如果不是,则直接添加数据)、取消帧等

帧标志信息:用于存储加密的信息,如加密的类型

对应包唯一标示 :正数,范围为1~255(0一般不使用),比如头帧packet携带的是1,数据帧也是1,那么第二个packet来的时候携带的标示为2,数据帧也为2。当接收到标示为2时,则向相同的packet塞数据。此时,可以实现并发255个的消息传输。

预留空间 : 对于可能性的扩展

数据区 :帧载体

六、Packet新规则

packet包含包头和包体,包头为首帧,首帧为如图所示的数据结构。

包头的内容会添加到帧的数据区中,告诉packet的包体是多长,类型是什么,包体的packetinfo是什么。

包体包含很多帧。

七、帧Frame数据结构

八、首帧数据内容

上半部分是每一帧的头部部分

从Data Length开始,都属于数据部分。

数据部分,首先使用5个字节存储数据的长度,1个字节存储数据的类型,256个字节存储headerinfo

九、基础的类

Frame :分片的类

AbsSendFrame : 基础发送帧

AbsSendPacetFrame : 基础发送Packet帧

SendHeaderFrame : 发送头帧

SendEntityFrame :发送实体帧

AbsReceiveFrame : 基础接收帧

ReceiveHeaderFrame :接收头帧

ReceiveEntityFrame :接收实体帧

CancelSendFrame :取消发送的帧

AsyncPacketReader : 管理packet的接收,实现分片的逻辑

AsyncPacketWriter : 管理packet的接收,实现分片的逻辑

BytePriorityNode : 带优先级的结点,可用于构成链表

十、类图

十一、将Packet转为Frame的过程

发布了174 篇原创文章 · 获赞 115 · 访问量 83万+

猜你喜欢

转载自blog.csdn.net/nicolelili1/article/details/104523752