文件消息模型分片实现:
- 发送中没法取消文件发送。若是发送方中断了链接,那么这个时候他是一个中断的状态,他并非说他取消了整个文件的传输,这不属于取消。
- 大文件传输过程中容错率较低。由于咋们整个传输一旦出现问题,那么整个文件的一个问题就暴露了,若是说这个文件很是大,大于了几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组合