码迷,mamicode.com
首页 > Windows程序 > 详细

C#技术分享【基于socket的断点续传功能】

时间:2015-07-13 00:53:06      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:断点续传   c#   socket   发送   传输   

最近开发了一个异地灾备传输工具,每周从广州服务器同步5g大小的数据库备份文件到北京服务器。

第一个版本的传输工具开发得很简单,两个window服务,一个负责发送,另一个负责接收,利用socket建立tcp链接,在测试服务器上传输10g大小的文件没有问题。

但部署到生产环境之后,每次传输了3g左右的数据就中断了,经分析是由于网络不稳定造成的,所以需要对传输工具添加断点续传功能,当传输意外中断时,可以自动连接,并完成上一次未完成的传输。

断点续传的原理很简单,就是分割需要传输的文件,每次传输一小块数据,并附带数据的位置和大小信息,服务器成功接收数据之后,则继续下一块数据的传输,否则重复上一块数据的传输,直到成功为止。

这实际上是为你的传输功能添加了暂停功能,网络中断的我时候暂停传输了,网络恢复之后继续再传。

既然搞清楚原理了我们就赶紧开始写代码吧,下面是核心代码。


封装一个类包含一下字段,用来记录传输的状态:FileName 文件名、FileSize 文件大小、PackageSize 数据包的大小、PackageCount 传输总次数,Index 当前传输位置。每次发送数据包时,带上这些信息,就算意外中断了,重新连上了之后,也可以很轻易的判断传输的进度。

public class BreakPointPost
{
    public string FileName { get; set; }
    public long FileSize { get; set; }
    public long PackageSize { get; set; }
    public int PackageCount { get; set; }
    public int Index { get; set; }
}

获取文件的传输次数

private static int GetFilePackageCount(long fileSize, long packageSize)
{
    int count = 0;
    if (fileSize % packageSize > 0)
        count = Convert.ToInt32(fileSize / packageSize) + 1;
    else
        count = Convert.ToInt32(fileSize / packageSize);
    return count;
}

分块读取文件

private static byte[] FileRead(string path, int index, long size)
{
    byte[] result = null;
    long length = (long)index * (long)size + size;
    using (FileStream stream = File.OpenRead(path))
    {
        if (length > stream.Length)
            result = new byte[stream.Length - ((long)index * (long)size)];
        else
            result = new byte[size];
        stream.Seek((long)index * (long)size, SeekOrigin.Begin);
        stream.Read(result, 0, result.Length);
    }
    return result;
}

分块接受文件

private static void FileWrite(string path, int index, long packageSize, int receiveSize, byte[] data)
{
    using (System.IO.FileStream stream = System.IO.File.OpenWrite(path))
    {
        stream.Seek((long)index * (long)packageSize, System.IO.SeekOrigin.Begin);
        stream.Write(data, 0, receiveSize);
        stream.Flush();
    }
}

以上便是核心代码,大家可以根据这些代码,写出自己的断点续传功能啦。
当然,完整的代码示例肯定是少不了的,以下两个版本大家按需下载。
1、控制台版(下载有惊喜)
2、Windows服务版(生产版本)
3、喜欢用GitHub的童鞋们也可以点我fork

版权声明:本文为博主原创文章,未经博主允许不得转载。

C#技术分享【基于socket的断点续传功能】

标签:断点续传   c#   socket   发送   传输   

原文地址:http://blog.csdn.net/shi0090/article/details/46855097

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!