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

  • 相关阅读:
    475. Heaters
    69. Sqrt(x)
    83. Remove Duplicates from Sorted List Java solutions
    206. Reverse Linked List java solutions
    100. Same Tree Java Solutions
    1. Two Sum Java Solutions
    9. Palindrome Number Java Solutions
    112. Path Sum Java Solutin
    190. Reverse Bits Java Solutin
    202. Happy Number Java Solutin
  • 原文地址:https://www.cnblogs.com/howardhuo/p/4390672.html
Copyright © 2011-2022 走看看