注册 | 登陆
浏览模式: 标准 | 列表2008年09月的文章

浅谈socket编程实现HTTP下载

在Windows下实现HTTP下载,其实很容易,微软已经帮我们封装好了简便易用的wininet库,利用它提供的API,很容易就能开发出具备HTTP下载功能的程序,不过我在这里并不准备对wininet进行讨论,有兴趣的朋友可以自行查阅MSDN或者相关资料。

我在这里要说的,是直接使用socket编程,来实现HTTP的下载。这种看似底层和原始的方法,虽然实现起来比较麻烦(仅仅是麻烦而已,其实很简单),但对我们了解HTTP的工作原理和应对非Windows平台的编程,都有一定的帮助,所以我将这几天自己学习的心得体会,记录于此。本文主要涉及socket编程实现直接HTTP下载和通过代理服务器进行HTTP下载。

HTTP消息头

说是socket编程,但核心其实是对HTTP消息头的处理,包括格式化发送,以及接受解析。一个典型的用于下载的HTTP请求头大概是这样的:

GET /test/test.zip HTTP/1.1  -- "GET"是命令,后接要下载的文件,HTTP表示版本
Host: www.gl.gx.cn  -- 主机域名
Accept: */*  -- 接受任何类型的文件
User-Agent: MyApp  -- 浏览器的类型
Connection: Keep-Alive  -- 保持连接

 -- 空行,表示请求头结束

"--"后面的是我加的注释,请求头不包括这些东西。

这里注意还有一个内容没有列出来,但是对于HTTP下载来说是比较重要的,就是"Range"项,像这样"Range: bytes=起始位置 - 终止位置",要实现多线程下载和断点续传就都靠他了。我并不打算详细解说每一项内容,有兴趣的可以查阅相关资料。

一个典型的服务器返回的响应头如下:

HTTP/1.1 200 OK -- 响应代码及指示文本
Content-Length: 1679134430 -- 数据块长度
Content-Type: application/x-zip-compressed -- 数据块文件类型
Last-Modified: Wed, 15 Mar 2006 13:40:59 GMT -- 修改时间
Server: Microsoft-IIS/6.0 -- 服务器信息
Date: Fri, 26 Sep 2008 08:42:01 GMT -- 时间
  -- 空行,表示响应头结束
XX XX XX XX XX ... -- 数据块字节数据

格式化的信息清晰明了,要注意的是,请求的数据将会紧跟在表示响应头结束的空行后面,所以这里要自己进行拆分处理等等工作。

Socket实现HTTP下载

1 - 和服务器建立连接
2 - 格式化请求头
3 - 发送请求头
4 - 接收服务器返回的数据
5 - 拆分、分析响应头
6 - 接收数据

以上就是简要的步骤,实际编程的时候,还有些细节需要动动脑筋来实现,比如拆分响应头和返回的数据,这里提供一种思路,接收的时候一个字节一个字节的接收,然后利用换行符和最后的空行来判断响应头和数据块的分界点,达到拆分数据的目的。

Socket通过代理服务器实现HTTP下载

以上的方法在实际测试时,不能成功,在第一步就失败了,无法和服务器建立连接(用wininet不会有这个问题),判断是由于公司采用代理服务器上网造成的,无法直连外网。那如何在使用代理服务器的情况下进行下载呢?

答案其实也很简单,上面的几个步骤稍微修改即可,如下:

1 - 和代理服务器建立连接
2 - 向代理服务器发送对目标服务器的连接请求
3 - 格式化请求头
4 - 发送请求头
5 - 接收服务器返回的数据
6 - 拆分、分析响应头
7 - 接收数据

第一步首先和代理服务器进行连接,而不是和目标服务器,这样就可以向代理服务器发送HTTP请求,只不过这次首先发送的是一个连接请求,如下:

CONNECT www.gl.gx.com:80 HTTP/1.1 -- 连接目标服务器
Connection: Keep-Alive -- 保持连接
  -- 空行结束

成功以后,就和目标服务器连接上了,然后就和原来直连一样了,像它发送请求就可以了。

上述通过代理进行下载的方法有一个前提,就是你必须获得代理服务器的地址,才能和它进行连接。当然可以手动指定或者从配置文件中读取,但更多的朋友应该是希望能够取得并使用IE的代理信息,有两个方法可以实现,一个是读取注册表,这个我也没什么研究。。。另一个就是使用wininet提供的InternetQueryOption函数,具体可以参阅MSDN,如果用到了wininet,那么还不如连下载也使用它来的方便。。。

本文只是简单介绍了一下HTTP直接下载和代理下载的原理,都是我这几天的心得和体会,没有提供任何源代码,因为我也没写出完整的示例代码,因为我最终决定偷懒,直接使用wininet来实现http下载的功能... ╮(╯_╰)╭

Tags: vc, socket, http, 下载, 代理

60届艾美奖有感

9月22日,美国电视届的盛典,第60届艾美奖落下帷幕,双"狂"成为最大赢家,真人秀首次入住艾美。

编剧罢工的影响似乎也带到了本届艾美,由于首次设立真人秀类奖项,因此本届典礼史无前例的选择了获得最佳真人秀类节目主持人的五位入围者来担当典礼的主持,正如五位主持人开场所说的,本届艾美没有剧本,本届艾美就是一场真人秀。但是颁奖典礼毕竟不同于真人秀,对主持人的临场反应、搞笑以及带动气氛的能力有着更高的要求,显然这五位主持都没能达到这样的要求,毕竟像Survivor(幸存者)的主持人Jeff Probst(P.S.第一次看到Jeff穿得这么正式,还真不习惯%>_<%),甚至是第一次在室内进行主持...除了性感撩人的Heidi Klum起到养眼的效果以外,整场下来主持的表现可谓乏善可陈,没有什么亮点。

从入围跟获奖的情况来看,很多剧集并没有很高的收视率,属于冷门剧集居多,此外还有一个共同特点,就是大都是只播出了一两季的新剧集,像去年风光无限的Desperate Housewives(绝望的主妇),今年甚至连边都沾不上,可以看出最近几年热门长集美剧已经开始出现审美疲劳的态势。

本届最大赢家30 Rock(我为喜剧狂)一举夺得包括最佳喜剧类剧集、最佳喜剧类男女主角、最佳编剧、最佳选角在内的五项大奖,Tina Fey可谓功不可没,她一人就独揽最佳喜剧类女主角和最佳编剧两项大奖,这也是开创历史的壮举,这位美国电视届的第一才女,续写着自己的传奇。

大小: 111.93 K
尺寸: 249 x 320
浏览: 40 次
点击打开新窗口浏览全图
美国电视届第一才女 Tina Fey (P.S.偶真是越来越喜欢她了o(≧v≦)o)

另外,备受瞩目的首次进入艾美奖的真人秀类奖项也各有归属,Kathy Griffin: My Life on the D-List(小明星凯西·格里芬)获最佳真人秀节目,The Amazing Race(急速前进)获最佳竞赛类真人秀节目,Survivor(幸存者)的主持Jeff Probst获最佳真人秀节目主持人。

大小: 74.33 K
尺寸: 198 x 320
浏览: 36 次
点击打开新窗口浏览全图
Survivor(幸存者)主持人 Jeff Probst

后记:其实我想说的是,我唯一跟的喜剧类美剧,就是30 Rock(我为喜剧狂);我唯一跟的两部真人秀,一部是The Amazing Race(急速前进),另一部就是Survivor(幸存者)......这样看来,我其实很有做评委的资质呀,娃哈哈哈哈哈...↖(^ω^)↗

Tags: 艾美, emmy, 美剧

低迷的九月

人家都说金九银十,可我的九月总显得灰蒙蒙的,自从工作以后,总觉得有一种失落感,再加上一些其他的事情,一股压抑感一直萦绕在心,挥之不去。

九月"Gossip Girl", "Prison Break", "Terminator - The Sarah Connor Chronicles"等剧的回归,也没能填满我那空荡荡的精神世界,其他新剧诸如"90210", "Fringe"也仅仅是隔靴搔痒,估计接下来的"Heroes", "Survivor - Gabon", "Tha Amazing Race"也只能是借剧消愁。

也许我现在真正需要的是有事情做,需要的是体会忙碌的充实感和成就感,而不是在办公室和在网吧一样,天天只是上网和偶尔碰碰FM,也许此时我更羡慕那些仍然对PC游戏情有独钟的人吧,因为至少他们还能乐在其中,我确是怎么都提不起兴趣。
P.S.某天开会,第一次听到有人把软件工程中的QA解释为"Question & Answer"的,当场被雷翻...orz

平时每天从早到晚对着电脑,直接导致了周末反而成了最难熬的时期,想远离电脑,却又无事可干。曾经看过这样一句话"成天挂在QQ上的,不是上班无事可做,就是下班无人可爱",你猜怎么着,我两者皆是!怎么没见我买彩票有这么好运气...

如果,360的FIFA09或者PES09能先发布一个,我也不至于跑来写这篇文章了吧...

中秋快乐

海上生明月,天涯共此时。

举杯邀明月,共贺中秋时。