关于网友提出的“ socket多线程断点续传下载的疑惑”问题疑问,本网通过在网上对“ socket多线程断点续传下载的疑惑”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: socket多线程断点续传下载的疑惑
描述:本帖最后由 tg2003 于 2009-06-18 20:40:19 编辑
最近在学习socket多线程下载,找了很久这方面的资料,也没找到个结果。为此,自己想当然的设计了socket多线程的下载方法:
我对socket多线程的理解是,只有目标文件支持断点继传,才能谈得上socket多线程。
我设计的下载原理:
将文件分为5个偏移量,再创建5个线程,每个线程创建一个套接字,负责
接收指定大小的内容,比如文件大小为500KB,那么就进行如下接收:
线程1: 接收0~100KB
线程2: 接收101~200KB
线程3: 接收201~300KB
线程4: 接收301~400KB
线程5: 接收401~500KB
每个线程都进行connect操作,当接收完毕指定大小的内容后,线程结束。由于recv有时会阻塞,所以用了select函数进行了判断。
问题:
我将整个下载功能放在了一个函数中,如DownFile,用这个方法可以成功进行多线程下载。但我再开5个线程,用DownFile同时下载5个文件时,一般情况下不会有问题,但有时批量下载的5个线程阻塞,无法返回,我一直找不出是什么原因。是我的多线程下载方法有问题?
为了解决我的问题,我下载了一个开源下载工具——axel。
看了下axel的源码,发现它的多线程下载原理
好像是这样的:
axel的多线程下载原理:
将文件分为5个偏移量,再创建5个线程,每个线程负责
连接和发送操作,并创建5个套接字。
连接和发送成功后,接着用死循环接收每个套接字返回的数据。
疑惑:
1.用我的下载方法,为什么批量下载时会出问题?是下载原理有致命问题?
2.axel的多线程是用在了connect和send函数中,如果开了5个线程的话,
好像只send了5次。而recv接收数据时则没有用多线程。我想像中应该是在recv时用多线程才对呀,因为recv才会占用时间。
如果是我对多线程下载的理解错了,那麻烦说一下socket多线程下载的原理,谢谢!
解决方案1: 1. 要看服务器那边是怎么实现的了。应该是你用的协议跟axel的协议不一样,服务器那边不认识你的协议,不会如期完成下载。
你可以自己实现一个服务器端,accept5个连接请求,然后分别传输5个文件的5个分片。
2.axel可能用了单线程异步套接字,非阻塞的方式。比如select方式或者其他异步方式,都只需要一个线程就够了。目的是减少线程资源占用和线程切换开销
解决方案2: 去理解理解概念,代码是代码,线程是线程,有啥关系
解决方案3:
lz应该说的是下一个文件没文件,下多个文件的时候有问题
解决方案4:但我再开5个线程,用DownFile同时下载5个文件时,一般情况下不会有问题,但有时批量下载的5个线程阻塞,无法返回,我一直找不出是什么原因。
没看懂是什么意思.究竟是有问题呢,还是没问题.批量下载是什么意思?
解决方案5: 我也有疑问,就是即使是多线程,那么每个线程体还是共用一段代码
那么,运行的时候,是5份一样的代码一起在内存跑么?那跟踪又是跟踪的谁呢?
线程之间有独立的内存吧,独立内存存放该线程的一些变量
解决方案6:
每个线程都有不同的传入参数,而且可以设置优先级
解决方案7: 帮lz顶下!!
解决方案8: 要看服务器是否支持。
解决方案9: 对,断点续传,需要服务器支持才行。
以上介绍了“ socket多线程断点续传下载的疑惑”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2985187.html