多线程以及多线程下载、断点续传 【讨论】

多线程以及多线程下载、断点续传 【讨论】

最近看了几篇讲多线程的文章,在网上搜到 多线程下载(对一个文件,断点续传) 的描述,可是调不太好
大家有这方面的经验不
交流、指教哈
下面是几段代码:(我想着是吧两段都调通了,合在一起,就可以弄多线程下载了,从而实现断点续传)
----------------------------------------------------
多线程没问题

[Copy to clipboard] [ - ]
CODE:
#coding:utf-8
#多线程
import threading
import time

class mythread(threading.Thread):
        def __init__(self, threadname):
                threading.Thread.__init__(self, name = threadname)

        def run(self):
                for i in range(10):
                        print self.getName, i
                        time.sleep(1)
t1 = mythread('t1')
print t1.getName(),t1.isDaemon()
t1.setDaemon(True)
print t1.getName(),t1.isDaemon()
t1.start()

--------------------------------------------------------
下载(为断点续传做准备)有问题;解决了

[Copy to clipboard] [ - ]
CODE:
def testSend():
        import httplib

        headers = {
                'Range':'bytes=%s-%s' % ( 1, 1000 )
        }
        conn = httplib.HTTPConnection(url,80)
        conn.request("GET", url + "/index.html", '', headers)
        response = conn.getresponse()
        value = response.read()
        conn.close()

        f = file("c:\s.html","w")
        f.write(value)
        f.close()

#testSend("http://www.100infor.cn/") #用这个就出错
testSend("www.100infor.cn") #解决了,不加http://

-----------------------------------------------
不过又有了新问题:
'Range':'bytes=%s-%s' % ( 0, 1000 )
好像没有反应,每次都是下载全部,按照规划是只下0-1000字节的数据;
怎么回事了,查找中~~

写了个多文件的多线程下载,断点续传还没影子,继续努力

#coding:utf-8
'''
多线程下载 2009-01-8 03:21:03 Victor
'''
from urllib import urlopen
import threading
import re
import time
import os

class threadRun (threading.Thread):
    '''
    创建线程
    '''
    def __init__ (self, threadname, url):
        threading.Thread.__init__(self, name = threadname)
        self.url = url

    def run (self):
        catchDta (self.url)


def catchDta (url):
    '''
    数据读取、下载
    '''
    try:
        data = urlopen(url).read()
        if len(data) < 11024:
            print url + "\t[Failed]"
            return

        path = "c:\\FilesCatch"
        pathCreat (path)
        seps = url.split("/")
        name = seps[-1]
        pattern = re.compile(r'\.(.*)', re.IGNORECASE)
        file_type = pattern.search(name).groups()[0]
        #print file_type
        now = time.localtime(time.time()) #时间
        i = 1
        file_name = (path + "\\%d%d%d-%d%d." + file_type) % (now[0], now[1], now[2], now[5], i)
        while os.path.exists(file_name) :
            i = i + 1
            file_name = (path + "\\%d%d%d-%d%d." + file_type) % (now[0], now[1], now[2], now[5], i)

        f = file(file_name, "wb")
        f.write(data)
        f.close()
        print file_name + "\t[Successed]"
    except:
        print url + "\t-[Failed]"

def pathCreat (way):
    '''
    创建文件夹
    '''
    try:
        if not os.path.exists(way):
            os.mkdir(way)
    except:
        print "Failed to create directory " + way
        exit()

urls = [
"http://hiphotos.baidu.com/%D3%C4%DA%A41234/pic/item/e0130a1f1ba7e4d0a7866987.jpg",
"http://hiphotos.baidu.com/%D3%C4%DA%A41234/pic/item/e0130a1f1ba7e4d0a7866987.jpg",
"http://hiphotos.baidu.com/%D3%C4%DA%A41234/pic/item/e0130a1f1ba7e4d0a7866987.jpg",
"http://hiphotos.baidu.com/%D3%C4%DA%A41234/pic/item/e0130a1f1ba7e4d0a7866987.jpg",
"http://hiphotos.baidu.com/%D3%C4%DA%A41234/pic/item/e0130a1f1ba7e4d0a7866987.jpg",
"http://www.baidu.com/index.html",
"http://www.baidu.com/",
]

for item in urls:
    t = threadRun('num', item)
    t.start()
else:
    print "over"


http断点续传就是在请求头里加上 Range:bytes=xxxxx-  这样的一行而已。
你的'Range':'bytes=%s-%s' % ( 1, 1000 )这个不对。要从已经下载的位置开始。
这个不用控制几个线程数吗?


QUOTE:
原帖由 cc520 于 2009-1-8 08:33 发表
这个不用控制几个线程数吗?

'Range':'bytes=%s-%s' % ( 1, 1000 )考虑一下这个替换出来是什么?
假设你已经下到100 还剩400没有下,用4个线程下剩余部分的话,那么各个线程的请求头是不是要Range:bytes=101-200,Range:bytes=201-300 等 ?所有的线程Range:bytes=1-1000应该是不行。

好贴,选占个位置先。
断点续传 解决了:
#testSend("http://www.100infor.cn/") #用这个就出错
testSend("www.100infor.cn") #解决了,不加http://

====================

不过又有了新问题:
'Range':'bytes=%s-%s' % ( 0, 1000 )
好像没有反应,每次都是下载全部,按照规划是只下0-1000字节的数据;
怎么回事了,查找中~~
0
                                                    0

断点续传需要服务器支持。
有的服务器不支持range,你就没办法断点续传。


QUOTE:
原帖由 guotie 于 2009-1-9 09:08 发表
断点续传需要服务器支持。
有的服务器不支持range,你就没办法断点续传。

服务器不响应含有range的请求头?