zoukankan      html  css  js  c++  java
  • 基于HTTP协议下载文件的实现

    最近在开发文件下载的程序,该程序是基于HTTP开发的。

    首先是了解了文件传输到客户端的大概格式,然后分析该格式,实现写入文件的功能.

    自己构造的HTTP包如下:

    GET /*********.rar HTTP/1.1
    
    host:www.****.com
    
    connection:keep-alive
    
    

    这个请求成功发出去了,而服务器的回应也是成功的,HTTP/1.1 200..................

    可惜的是,我的循环接收不争气,本来800KB左右的文件,只能接收到70KB左右,只是什么原因呢?

    ------------------------------------------------------------------------------------------------------------

    通过多次的尝试,终于找到原因了。不过这个原因的原因还不清楚,让我说说这个原因吧。

    构造这个请求是正确的,不过最好将connection的值改为close,不然程序会等待连接失效。

    本来我的程序是这样接收数据的。

    while(1)
    {
        recvSize=recv(mySock,dataBuf,1000,0);
        file.write(dataBuf,recvSize);
        memset(dataBuf,0,1000);
        if(recvSize<1000)
        {
            break;
        }
    }

    我本来认为数据接收到最后的时候,且必须是最后的时候,数据块才会减少。但实践证明,数据接收的中途,会出现数据块没填满的情况,其中原因有待研究。

    现在,我将接收的循环改为recvSize<=0就break,程序便正确的接收完整了。

    while(1)
    {
        recvSize=recv(mySock,dataBuf,1000,0);
        if(recvSize<=0)
        {
            break;
        }
        file.write(dataBuf,recvSize);
        memset(dataBuf,0,1000);
    }

    用recvSize<1000的那个循环不行的原因,估计是因为网络上的问题。因为网络可能会出现延迟,或者是网络不好的情况,使接收的数据不一定能把缓存塞满。

    -------------------------------------------------------------------------------------------------------------------------------------------------

    在这里,再说一下基于http协议的文件下载,服务器是如何把数据发到客户端的。

  • 相关阅读:
    easyui带file上传控件表达提交
    WebApi返回json
    同一个项目中使用MVC控制器和WebAPI控制器
    jquery disabled
    ITIL(Information Technology Infrastructure Library )
    jquery.formatDateTime
    sqlserver 表连接更新字段
    C#分页的总页数算法
    Angular入门教程三
    Angular入门教程二
  • 原文地址:https://www.cnblogs.com/howardhuo/p/4390672.html
Copyright © 2011-2022 走看看