博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Socket IO与NIO(六)
阅读量:7115 次
发布时间:2019-06-28

本文共 1892 字,大约阅读时间需要 6 分钟。

文件消息模型分片实现:

  • 发送中无法取消文件发送。如果发送方中断了连接,那么这个时候他是一个中断的状态,他并不是说他取消了整个文件的传输,这不属于取消。
  • 大文件传输过程当中容错率较低。因为咋们整个传输一旦出现问题,那么整个文件的一个问题就暴露了,如果说这个文件非常大,大于了几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组合

转载地址:http://xdzel.baihongyu.com/

你可能感兴趣的文章
UVA 11404 五 Palindromic Subsequence
查看>>
关 于 解 压 缩 的 类 习 题
查看>>
[C]字符串排序之-冒泡法
查看>>
浅析企业门户的价值
查看>>
我的友情链接
查看>>
python云计算1
查看>>
CSV文件保存为utf8编码格式
查看>>
浅谈Comparable与Comparator的区别
查看>>
玩转 eclipse:[2]代码重构
查看>>
PHP导出MySQL数据到Excel
查看>>
Javascript的console.log()用法
查看>>
小程序里json字符串转json对象需注意的地方
查看>>
struts过滤器和拦截器的区别
查看>>
runtime 的常用姿势
查看>>
Unix编程艺术阅读笔记
查看>>
创建git库
查看>>
[译] 将第三方动画库集成到项目中 — 第 1 部分
查看>>
VC获取当前程序运行路径
查看>>
场景调研
查看>>
JavaScript 小数取整的函数
查看>>