• DELPHI高性能大容量SOCKET并发(八):断点续传(上传也可以续传)


    断点续传

    断点续传主要是用在上传或下载文件,一般做法是开始上传的时候,服务器返回上次已经上传的大小,如果上传完成,则返回-1;下载开始的时候,由客户端上报本地已经下载大小,服务器根据位置信息下发数据,因此上传下载协议都需要带Size大小,例如我们协议格式。

    上传开始:

    客户端->服务器

    {

    [Request]

    Command=Upload

    Dir=Dir                        #目录,全路径名

    FileName=FileName      #文件名(不包括路径)

    }

    服务器->客户端

    {

    [Response]

    Command=Upload

    Code= Error Code                #错误码

    Message=Message                 #如果出错,返回错误描述信息

    FileSize=FileSize                 #已上传文件的大小,用于续传

    }

    下载开始:

    客户端->服务器

    {

    [Request]

    Command=Download

    Dir=Dir                        #目录,全路径名

    FileName=FileName      #文件名(不包括路径)

    FileSize=FileSize          #客户端本地文件大小,用于断点续传

    PacketSize=PacketSize   #下发数据包大小,单位为KB,用于速度测试

    }

    服务器->客户端

    {

    [Response]

    Command= Download

    Code= Error Code                #错误码

    Message=Message                 #如果出错,返回错误描述信息

    }

    多线程并发下载

    断点续传的一个应用就是并发下载,做法是客户端起多个线程并发请求同一个文件,每个线程下文件的一部分,全部下载完成后,把每个数据块合并为一个文件。这个服务端和客户端协议都不需要修改,只是需要做下载逻辑的更改。

    多线程并发上传

    这个需要定义通讯来支持这个逻辑,主要是服务器要提供合并多个数据文件为一个文件的协议逻辑。

    V1版下载地址:http://download.csdn.net/detail/sqldebug_fan/4510076,需要资源10分,有稳定性问题,可以作为研究稳定性用;

    V2版下载地址:http://download.csdn.net/detail/sqldebug_fan/5560185,不需要资源分,解决了稳定性问题和提高性能;免责声明:此代码只是为了演示IOCP编程,仅用于学习和研究,切勿用于商业用途。水平有限,错误在所难免,欢迎指正和指导。邮箱地址:fansheng_hx@163.com

    http://blog.csdn.net/sqldebug_fan/article/details/7901848

    协议种类

    开发Socket程序有两种协议类型,一种是用文本描述的,类似HTTP协议,定义字符集,好处是兼容性和调试方便,缺点是解析文本会损耗一些性能;一种是用Code加结构体,定义字节顺序,好处是性能高,缺点是兼容性和调试不方便。这个可以根据应用场景灵活选择,如果您的应用相对稳定,需求变化少,性能要求高,则可以使用Code加结构体的方式。如果您的应用需要不停的扩充功能,但是对性能要求不苛刻,则可以使用文本解析的方式。这两种协议有两个比较典型的应用场景,Code加结构体更多应用在中间件上,因为协议的封装都是透明的,不需要联调,而且性能要求较高;文本解析则更多应用在外部交互上,如和设备、手机通讯,需要联调,但是性能要求没那么高。

    我们Demo是采用文本解析的方式,具体可以根据应用灵活选择。

    定义协议有以下注意点(方便不同平台接入)。

    字节顺序

    不同硬件平台或操作系统下,字节顺序是不一致的,有的是高位在前,低位在后,有的则是低位在前。Windows是低位在前,高位在后,每个平台下都有函数实现字节转换。TCP/IP定义的字节顺序是高位在前、低位在后,可以使用

    [delphi] view plain copy
     
    1. function ntohl(netlong: u_long): u_long; stdcall;  
    2. function ntohs(netshort: u_short): u_short; stdcall;  
    来实现网络字节顺序转为本地字节顺序,反之可以调用
    [delphi] view plain copy
     
    1. function htonl(hostlong: u_long): u_long; stdcall;  
    2. function htons(hostshort: u_short): u_short; stdcall;  
    来实现本地字节顺序转为网络字节顺序。

    更流行的做法是使用网络字节顺序,这样规范统一。我们这里使用Windows字节顺序,即低位在前、高位在后,和网络字节顺序刚好相反。

    字符集

    字符集最合适的就是使用UTF-8,这个编码是免费的,对于某些不支持中文的嵌入式系统,全英文可以不需要转换就是UTF-8格式,对于跨平台具有优势。

    数据包格式

    Code加结构体、文本解析两种协议风格都是统一使用相同的数据包格式,即先发一个4字节的长度,后面跟着是内容,下一个也是先发一个4字节长度,接着是内容。

    V1版下载地址:http://download.csdn.net/detail/sqldebug_fan/4510076,需要资源10分,有稳定性问题,可以作为研究稳定性用;

    V2版下载地址:http://download.csdn.net/detail/sqldebug_fan/5560185,不需要资源分,解决了稳定性问题和提高性能;免责声明:此代码只是为了演示IOCP编程,仅用于学习和研究,切勿用于商业用途。水平有限,错误在所难免,欢迎指正和指导。邮箱地址:fansheng_hx@163.com

    http://blog.csdn.net/sqldebug_fan/article/details/7901845

  • 相关阅读:
    uIP tcp/ip协议分析及其在嵌入式系统中的应用
    围棋学习网站 (updating)
    几种代价函数
    浅谈围棋自学入门 写给想自学围棋的业余爱好者
    在 Ubuntu Natty 中解除系统托盘限制
    MATLAB中的CELL用法
    支持向量机(SVM)
    成功思维的三十个模式
    Microsoft Kinect SDK vs PrimeSense OpenNI
    生命中的选择
  • 原文地址:https://www.cnblogs.com/findumars/p/8196142.html
Copyright © 2020-2023  润新知