文件消息模型分片实现:
- 发送中无法取消文件发送。如果发送方中断了连接,那么这个时候他是一个中断的状态,他并不是说他取消了整个文件的传输,这不属于取消。
- 大文件传输过程当中容错率较低。因为咋们整个传输一旦出现问题,那么整个文件的一个问题就暴露了,如果说这个文件非常大,大于了几M甚至 是G的文件,那么这样的情况下,整个文件是没办法进行校验的,我们不知道文件在哪个部分可能会出现错误,而如果我们把文件分成一小份 一小份的方式传输,加入谋一份出现问题的时候,那么前面的部分我可以保证他的完整性。
- 同一连接无法实现文件、普通消息优先级。我们在队列当中加入了一个文件传输的消息,并且加入了一个字符串的消息,此时文件传输的消息先 进行执行了,那此时他会完全占用整个连接,直到文件传输完成之后,才会去发送咋们的普通消息。在这个过程当中无法中途去中断咋们的 文件消息,在中途去添加咋们的文字消息,一定得等到前面的文件完全发送完毕之后,才可以发送你的普通消息,这是一个劣势。当然你可以 把他分成不同的连接,这就暴露了咋们必须基于一个Packet发送完成,才能发送下一个Packet,无法实现多个Packet同时发送的可能性,在 同一个连接当中,这就是劣势。
文件数据分片
无非就是把一个大的数据分成不同的小份数据,一小份一小份的发送,每个小份数据包前面都携带一个头部,来描述这一小份数据的长度。然后 接受方,会分别接受到一个小的数据头,并且进过这个头的计算之后,他可以得到我后面这个小的帧的大小。然后接收方接受到许多许多这些 小份数据,最终再把这些分片的头部去掉,只留下内容,把内容组合起来就形成了咋们Packet的body部分,也就实现了咋们数据分片传输的理论 实现。
分片数据传输流程
首先Packet依然是input stream,然后会加入一个小的buffer,这个buffer可能存在于读取的channel当中,然后我会把数据通过咋们的buffer ,接受到数据之后,再把每一个buffer数据填充到Frame分片里面去。然后咋们的分片接受完了之后有可能没有接受满,这个时候会循环的读取, 直到把当前的分片读取满了之后,这个时候会把这个分片发送,这就是新的传输逻辑。
分片逻辑实现:
- 根据文件大小计算分片、并读取数据分片。
- 分片数据固定格式打包发送。
- 分片数据解析与分片组装。
- Dispatcher调度逻辑调整。这里可以理解为我们之前的一个发送是基于咋们的Packet级别,Packet首先把数据传输到IoArgs里面,最后在将IoArgs 进行一个网络发送,可以理解为这是2层的一个数据缓存。这个时候我们又给他加入新的东西叫做分片,这个地方我们可以理解为他其实是3层缓存的 逻辑,那么越往外层Packet级别走就越大,越往内层走,那么它越小,越贴近于实际的网络传输的底层的一个逻辑。
Packet规则
Packet部分,先发送包头,再根据包头信息去接受包体。
分片消息规则
帧不需要太大,因为他是承载数据的,这里只给当前帧大小分配了2个字节,并且2个字节强制他只能是正数,这2个字节标识的最大信息长度是 65535个字节,因为0占了一个字节。帧类型代表这是首帧还是数据帧,帧标志信息这个字节可以存储一些加密的信息。对应包唯一标识这1个字节 只有正数,代表1-255之间的一个值 0一般不使用,可以理解为我的一个消息Packet标识为1,他的头发送的时候,这个头帧是1,他的数据帧也是 1,第二个Packet过来的时候,我会给他分配为2,分配为2的情况下,他头帧自然而然是2,数据帧也是2。那么我接受到数据为2的时候,我就往 同样的这个接受方往同样的Packet里赛数据,这种情况下,我可以最多实现并发255这样的Packet消息传输。预留空间用于可能性的扩展。
首帧数据内容
红色框上面是每一帧数据的部分,红色框起来的部分是数据部分。首帧数据里面Data Length(5)是整个包体的大小,用5个字节来表示。 Data Type(1)代表type值。
文件快传总结:
- 文件传输与普通消息传输的区别。
- 重点:分片数据的概念、数据包发送与接受实现。把一个大的Packet分成不同的小的分片Frame,每个小的分片进行独立的传输,把小的分片 传输与接受整个流程拉通之后,前面的Packet可以做分片的发送,接受方可以接受到不同的分片,然后根据不同的分片,拼接到不同的 Packet里面去,最终实现咋们数据包的一个发送与接受的实现。
- 难点:如果进行一个数据分片并在穿插的情况下进行Packet组合