当从某个专业下载网站下载一 4G大小的安装程序时,此网站是怎样将此文件分割成多个文件,又是如何找个多个通道将此文件传递到下载端的

eisldkw 2019-06-18 02:19:30
当从某个专业下载网站下载一 4G大小的安装程序时,请问以下几个问题:
1、此网站是怎样将此文件分割成多个文件,
2、此网站如何能找到多个通道与下载端相连通的通道
3、下载端接收到这分割后的多个文件时,根据什么次序能将这些文件按原内容拼装成一个文件。

谢谢大家。
...全文
136 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
desperaso 2019-06-18
  • 打赏
  • 举报
回复
引用 4 楼 eisldkw 的回复:
非常感谢,我想请教一下第2问的问题。


那就看看websocket代码了,开源的,也可在Vs的Nuget项直接安装
https://github.com/sta/websocket-sharp
eisldkw 2019-06-18
  • 打赏
  • 举报
回复
引用 2 楼 desperaso 的回复:
http://bbs.cskin.net/thread-4431-1-1.html





非常感谢,我想请教一下第2问的问题。


eisldkw 2019-06-18
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
一个都不用管。zip文件本身就能分割成N份,下载还管啥通道,你浏览器怎么下载的?你访问的就下载了。zip的分割的包zip自己会合并

所以一个都不用你管


非常感谢,我想了解一下其背后动作的机理。
desperaso 2019-06-18
  • 打赏
  • 举报
回复
http://bbs.cskin.net/thread-4431-1-1.html
只是个练习作业仅参考,修改为你的ip地址,重新编译后运行,由于有vlc全格式音视频网播dll,所以比较大。

上传:客户端将文件分割为服务端限定的大小数据包,加上标识,发送到服务端,服务端接收后合并数据包为文件。
下载:与上传相同。
有新文件后,客户端会有新文件提醒,点击顶部刷新可更新当前显示。
分割文件的每个包为一段Base64字符串,并进行压缩,还原文件先解压缩字符串在合并Base64字符串,转为文件,
使用Base64字符串是因为传输byte,图像、媒体文件后打开错误,比如传输byte,生成图像文件是需要指定格式,
才能正确生成,等等。所以Base64最然大了点,但经过压缩后传输还可以。
也可用其它传输方法,有更高的效率,这里只是做练习。可以参考压缩文件内WebSocket-Sharp文件传输例子。


/// <summary>
/// 文件拆分包
/// </summary>
/// <param name="packFlag">包标识</param>
/// <param name="fileName">文件名</param>
/// <param name="packSize">包大小 kb</param>
/// <returns></returns>
public void FileSplit(string packFlag, string fileName, int packSize)
{
byte[] Bytes = null;
Bytes = ReadFileStream(fileName); // 读取文件
string Zipstr = ZipString(Convert.ToBase64String(Bytes)); // 压缩字符串

int packNum = (int)Math.Ceiling(Zipstr.Length / (double)packSize); // 包总数
string pack = null;

prog._maxNum = packNum; // 进度条最大值
Thread progress = new Thread(() =>
{
for (int i = 0; i < packNum - 1; i++)
{
pack = Zipstr.Substring(i * packSize, packSize);
ws_Client.Send(DesEncrypt(
tSocket.Transport_UploadPacket + Separator +
packFlag + Separator +
i+ Separator +
pack, sKey));

UpProgress_fm.CrossThreadCalls(() => { prog._setProgress(i); });
}
// 最后剩余字节打一个包
pack = Zipstr.Substring((packNum - 1) * packSize, Zipstr.Length - (packNum - 1) * packSize);
// 向服务器发送包:套接字、包标识、包总数、包序号、包内容
ws_Client.Send(DesEncrypt(
tSocket.Transport_UploadPacket + Separator +
packFlag + Separator +
packNum + Separator +
pack, sKey));
});
ws_Client.Send(DesEncrypt(tSocket.Transport_UploadOver + Separator + packFlag, sKey));
});
}
wanghui0380 2019-06-18
  • 打赏
  • 举报
回复
一个都不用管。zip文件本身就能分割成N份,下载还管啥通道,你浏览器怎么下载的?你访问的就下载了。zip的分割的包zip自己会合并 所以一个都不用你管

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧