基于HTTP协议下载文件的实现
最近在开发文件下载的程序,该程序是基于HTTP开发的。
首先是了解了文件传输到客户端的大概格式,然后分析该格式,实现写入文件的功能.
自己构造的HTTP包如下:
GET /*********.rar HTTP/1.1\r\n
host:www.****.com\r\n
connection:keep-alive\r\n\r\n
这个请求成功发出去了,而服务器的回应也是成功的,HTTP/1.1 200..................
可惜的是,我的循环接收不争气,本来800KB左右的文件,只能接收到70KB左右,只是什么原因呢?
------------------------------------------------------------------------------------------------------------
通过多次的尝试,终于找到原因了。不过这个原因的原因还不清楚,让我说说这个原因吧。
构造这个请求是正确的,不过最好将connection的值改为close,不然程序会等待连接失效。
本来我的程序是这样接收数据的。
while()
{
recvSize=recv(mySock,dataBuf,,);
file.write(dataBuf,recvSize);
memset(dataBuf,,);
if(recvSize<)
{
break;
}
}
我本来认为数据接收到最后的时候,且必须是最后的时候,数据块才会减少。但实践证明,数据接收的中途,会出现数据块没填满的情况,其中原因有待研究。
现在,我将接收的循环改为recvSize<=0就break,程序便正确的接收完整了。
while()
{
recvSize=recv(mySock,dataBuf,,);
if(recvSize<=)
{
break;
}
file.write(dataBuf,recvSize);
memset(dataBuf,,);
}
用recvSize<1000的那个循环不行的原因,估计是因为网络上的问题。因为网络可能会出现延迟,或者是网络不好的情况,使接收的数据不一定能把缓存塞满。
-------------------------------------------------------------------------------------------------------------------------------------------------
在这里,再说一下基于http协议的文件下载,服务器是如何把数据发到客户端的。
基于HTTP协议下载文件的实现的更多相关文章
- 基于BT协议的文件分发系统
基于BT协议的文件分发系统构成: 1.一个Web服务器:保存着种子文件 2.一个种子文件:保存共享文件的一些信息(文件名,文件大小 ,Tracker服务器地址,torrent为后缀) ...
- 用c++开发基于tcp协议的文件上传功能
用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学 ...
- 基于tcp的下载文件,以及struct模块的应用。
一 基于TCP的下载 客户端: from socket import * import os def main(): tcp_socket = socket(AF_INET, SOCK_STREAM) ...
- 根据http协议下载文件保存到相应的文件下
本实例通过提供的http网址来下载文件,并保存到本地指定的文件下. 本例提供的网址为:http://112.53.80.131:8888/database/11.mdb,下载的文件名为:11.mdb ...
- Linux下使用http协议下载文件
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...
- http协议下载文件
通过在 URL 上调用 openConnection 方法创建连接对象.(HttpURLConnection conn = (HttpURLConnection)new URL("网址&qu ...
- libcurl 通过http协议下载文件并显示下载进度
vc6 测试工程下载地址:http://download.csdn.net/detail/mtour/8068053 代码如下: size_t my_write_func(void *ptr, siz ...
- 关于:基于http协议大文件断点续传上传至web服务器
关键部分 前端用file.slice()分块 前端用FileReader获取每一分块的md5值 后端用MultipartFile接受分块文件 后端用FileOutputStream拼装分块文件 话不多 ...
- [php] thinkphp基于Http类 下载文件
http://blog.csdn.net/u010081689/article/details/49360937
随机推荐
- tomcat 配置项目
tomcat\conf\Catalina\localhost 下面存在项目配置文件信息,emas.xml 表示你eclipse中有个emas项目, 还有其他的项目xml.
- NSIndexPath的初始化方法
好几次用到了NSIndexPath,但是一直不知道怎么通过 row section这两个参数来初始化 NSIndexPath *index = [NSIndexPath indexPathForR ...
- iOS极光推送的基本使用
昨天花了一下午的时间研究了下极光推送,也前也是没做过,不知道从何下手!才开始的时候一看官方的SDK感觉好难,不过经过一系列的捣鼓之后,手机收到了推送信息,感觉其实并没有那么难! 1.配置开发证书(得有 ...
- mybatis动态sql语句问题
1.关于mybatis的insertintoselect命令未结束问题 添加: useGeneratedKeys="false" 官网的解释是 允许 JD ...
- git https连接方式,记住密码
Git使用https方式进行连接时,默认每次推送时都要输入用户名和密码. 可以使用命令 $git config credential.helper store 为当前仓库设置记住密码,设置后,只要在推 ...
- Android SQLite系列
转:http://blog.csdn.net/liuhe688/article/details/6715983 Android中如何使用SQLite. 现在的主流移动设备像Android.iPhone ...
- codeforces 659F . Polycarp and Hay 搜索
题目链接 遍历每个点, 如果这个点的值能被k整除并且k/a[i][j]后小于等于n*m, 那么就对这个点进行搜索. 将这个点加入队列, 将周围的所有大于等于这个点的值的点也加入队列. 不断重复, 直到 ...
- 手把手教程 Surface如何进行系统恢复?
手把手教程 Surface如何进行系统恢复? 2015-01-29 05:53:00 [ 中关村在线 原创 ] 作者: 周博林 | 责编:周博林 收藏文章 分享到 评论(10) Windo ...
- android 获取http网络图片保存png
1.android 获取网络图片的方式很多,普通网络通信的方式都可以用在获取网络图片上. android http获取数据常用的方式: 1.Apache接口(HttpClient) 2.标准Jav ...
- 无线功率 mW 和 dBm 的换算
无线电发射机输出的射频信号,通过馈线(电缆)输送到天线,由天线以电磁波形式辐射出去.电磁波到达接收地点后,由天线接收下来(仅仅接收很小很小一部分功率),并通过馈线送到无线电接收机.因此在无线网络的工程 ...