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协议的文件下载,服务器是如何把数据发到客户端的。

  • 相关阅读:
    Vue+element UI实现“回到顶部”按钮组件
    JS判断字符串长度的5个方法(区分中文和英文)
    从vue源码看Vue.set()和this.$set()
    mac下git安装与使用
    JS数组reduce()方法详解及高级技巧
    vue中router.go、router.push和router.replace的区别
    上传及更新代码到github(以及如何在vscode上提交自己的代码)
    VSCode打开多个项目文件夹的解决方法
    get请求和post请求的区别
    android 进程的优先级
  • 原文地址:https://www.cnblogs.com/howardhuo/p/4390672.html
Copyright © 2011-2022 走看看