• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

    python實(shí)現(xiàn)的一個p2p文件傳輸實(shí)例

    來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 14:38:28
    文檔

    python實(shí)現(xiàn)的一個p2p文件傳輸實(shí)例

    python實(shí)現(xiàn)的一個p2p文件傳輸實(shí)例:考慮到我手上的服務(wù)器逐漸的增多,有時候需要大規(guī)模的部署同一個文件,例如因?yàn)榉奖闶褂胹ystemtap這個工具定位問題,需要把手上幾百臺服務(wù)器同時安裝kernel-debuginfo這個包,原有的方式采用一個源服務(wù)器,采用rsync或者scp之類的文件傳輸方式只能做到一個點(diǎn)
    推薦度:
    導(dǎo)讀python實(shí)現(xiàn)的一個p2p文件傳輸實(shí)例:考慮到我手上的服務(wù)器逐漸的增多,有時候需要大規(guī)模的部署同一個文件,例如因?yàn)榉奖闶褂胹ystemtap這個工具定位問題,需要把手上幾百臺服務(wù)器同時安裝kernel-debuginfo這個包,原有的方式采用一個源服務(wù)器,采用rsync或者scp之類的文件傳輸方式只能做到一個點(diǎn)

    考慮到我手上的服務(wù)器逐漸的增多,有時候需要大規(guī)模的部署同一個文件,例如因?yàn)榉奖闶褂胹ystemtap這個工具定位問題,需要把手上幾百臺服務(wù)器同時安裝kernel-debuginfo這個包,原有的方式采用一個源服務(wù)器,采用rsync或者scp之類的文件傳輸方式只能做到一個點(diǎn)往下分發(fā)這個文件,這個時候下發(fā)的速度就會比較的慢,基于以上原因,我寫了一個基于bt協(xié)議傳輸文件的小工具,實(shí)際測試,傳輸?shù)?0個機(jī)房,70多臺機(jī)器傳輸一個240M的這個內(nèi)核文件,到所有的機(jī)器,源采用限速2m/s的上傳速度,測試的結(jié)果大概只要140s,就可以全部傳輸完畢,這個效率是非常之高,如果不限速的情況下速度會更快,下面把這個程序開源出來。

    代碼如下:


    #!/usr/bin/env python

    import libtorrent as lt
    import sys
    import os
    import time
    from optparse import OptionParser
    import socket
    import struct
    import fcntl

    def get_interface_ip(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s',
    ifname[:15]))[20:24])
    def ip2long(ip):
    return reduce(lambda a,b:(a<<8)+b,[int(i) for i in ip.split('.')])


    def get_wan_ip_address():
    interfaces = set(['eth0', 'eth1', 'eth2', 'eth3', 'em1', 'em2', 'em3', 'em4'])
    ip = ''
    for i in interfaces:
    try:
    ip = get_interface_ip(i)
    if (ip2long(ip) < ip2long('10.0.0.0') or ip2long(ip) > ip2long('10.255.255.255')) \
    and (ip2long(ip) < ip2long('172.16.0.0') or ip2long(ip) > ip2long('172.33.255.255')) \
    and (ip2long(ip) < ip2long('192.168.0.0') or ip2long(ip) > ip2long('192.168.255.255')):
    return ip
    except:
    pass

    return ip

    def make_torrent(path, save):
    fs = lt.file_storage()
    lt.add_files(fs, path)
    if fs.num_files() == 0:
    print 'no files added'
    sys.exit(1)

    input = os.path.abspath(path)
    basename = os.path.basename(path)
    t = lt.create_torrent(fs, 0, 4 * 1024 * 1024)

    t.add_tracker("http://10.0.1.5:8760/announce")
    t.set_creator('libtorrent %s' % lt.version)

    lt.set_piece_hashes(t, os.path.split(input)[0], lambda x: sys.stderr.write('.'))
    sys.stderr.write('\n')

    save = os.path.dirname(input)
    save = "%s/%s.torrent" % (save, basename)
    f=open(save, "wb")
    f.write(lt.bencode(t.generate()))
    f.close()
    print "the bt torrent file is store at %s" % save


    def dl_status(handle):
    while not (handle.is_seed()):
    s = handle.status()

    state_str = ['queued', 'checking', 'downloading metadata', \
    'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume']
    print '\ractive_time: %d, %.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d, seeds: %d) %s' % \
    (s.active_time, s.progress * 100, s.download_rate / 1000, s.upload_rate / 1000, \
    s.num_peers, s.num_seeds, state_str[s.state]),
    sys.stdout.flush()

    time.sleep(1)
    def seed_status(handle, seedtime=100):
    seedtime = int(seedtime)
    if seedtime < 100:
    seedtime = 100
    while seedtime > 0:
    seedtime -= 1
    s = handle.status()

    state_str = ['queued', 'checking', 'downloading metadata', \
    'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume']
    print '\rseed_time: %d, %.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d, seeds: %d) %s' % \
    (s.active_time, s.progress * 100, s.download_rate / 1000, s.upload_rate / 1000, \
    s.num_peers, s.num_seeds, state_str[s.state]),
    sys.stdout.flush()

    time.sleep(1)

    def remove_torrents(torrent, session):
    session.remove_torrent(torrent)

    def read_alerts(session):
    alert = session.pop_alert()
    while alert:
    #print alert, alert.message()
    alert = session.pop_alert()

    def download(torrent, path, upload_rate_limit=0, seedtime=100):
    try:
    session = lt.session()
    session.set_alert_queue_size_limit(1024 * 1024)

    sts = lt.session_settings()
    sts.ssl_listen = False
    sts.user_agent = "Thunder deploy system"
    sts.tracker_completion_timeout = 5
    sts.tracker_receive_timeout = 5
    sts.stop_tracker_timeout = 5
    sts.active_downloads = -1
    sts.active_seeds = -1
    sts.active_limit = -1
    sts.auto_scrape_min_interval = 5
    sts.udp_tracker_token_expiry = 120
    sts.min_announce_interval = 1
    sts.inactivity_timeout = 60
    sts.connection_speed = 10
    sts.allow_multiple_connections_per_ip = True
    sts.max_out_request_queue = 128
    sts.request_queue_size = 3

    sts.use_read_cache = False
    session.set_settings(sts)

    session.set_alert_mask(lt.alert.category_t.tracker_notification | lt.alert.category_t.status_notification)
    session.set_alert_mask(lt.alert.category_t.status_notification)

    ipaddr = get_wan_ip_address()
    #print ipaddr
    if ipaddr == "":
    session.listen_on(6881, 6881)
    else:
    session.listen_on(6881, 6881, ipaddr)

    limit = int(upload_rate_limit)
    if limit>=100:
    session.set_upload_rate_limit(limit*1024)
    session.set_local_upload_rate_limit(limit*1024)
    print session.upload_rate_limit()
    torrent_info = lt.torrent_info(torrent)
    add_params = {
    'save_path': path,
    'storage_mode': lt.storage_mode_t.storage_mode_sparse,
    'paused': False,
    'auto_managed': True,
    'ti': torrent_info,
    }

    handle = session.add_torrent(add_params)

    read_alerts(session)
    st = time.time()
    dl_status(handle)
    et = time.time() - st
    print '\nall file download in %.2f\nstart to seeding\n' % et
    sys.stdout.write('\n')
    handle.super_seeding()
    seed_status(handle, seedtime)

    remove_torrents(handle, session)
    assert len(session.get_torrents()) == 0

    finally:
    print 'download finished'

    if __name__ == '__main__':
    usage = "usage: %prog [options] \n \
    %prog -d -f -s \n \
    or \n \
    %prog -m -p -s \n"

    parser = OptionParser(usage=usage)
    parser.add_option("-d", "--download", dest="download",
    help="start to download file", action="store_false", default=True)
    parser.add_option("-f", "--file", dest="file",
    help="torrent file")
    parser.add_option("-u", "--upload", dest="upload",
    help="set upload rate limit, default is not limit", default=0)
    parser.add_option("-t", "--time", dest="time",
    help="set seed time, default is 100s", default=100)
    parser.add_option("-p", "--path", dest="path",
    help="to make torrent with this path")
    parser.add_option("-m", "--make", dest="make",
    help="make torrent", action="store_false", default=True)
    parser.add_option("-s", "--save", dest="save",
    help="file save path, default is store to ./", default="./")
    (options, args) = parser.parse_args()
    #download(sys.argv[1])
    if len(sys.argv) != 6 and len(sys.argv) != 4 and len(sys.argv) != 8 and len(sys.argv) != 10:
    parser.print_help()
    sys.exit()
    if options.download == False and options.file !="":
    download(options.file, options.save, options.upload, options.time)
    elif options.make == False and options.path != "":
    make_torrent(options.path, options.save)

    準(zhǔn)備環(huán)境:
    需要在所有的os上面安裝一個libtorrent的庫,下載地址:

    http://code.google.com/p/libtorrent/downloads/list

    記得編譯的時候帶上./configure –enable-python-binding,然后mak,make install,進(jìn)入binding目錄,make,make install就
    可以運(yùn)行這個小的工具
    當(dāng)然大規(guī)模部署不可能采用每一臺都去編譯安裝的方式,只要把編譯出來的libtorrent.so libtorrent-rasterbar.so.7的文件跟bt.py這個文件放到同一個目錄,另外寫一個shell腳本

    代碼如下:

    lib=`dirname $0`
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$lib
    python bt.py -d -f <種子文件> -s <文件保存路徑> -t <做種時間> -u <限制上傳速度>

    使用方法:
    首先在源服務(wù)器上面生成種子文件

    代碼如下:

    python bt.py -m -p <要發(fā)布的文件或者文件夾> -s <種子保存地址>


    發(fā)布文件
    在源服務(wù)器上面,執(zhí)行

    代碼如下:

    python bt.py -d -f <種子文件> -s <文件保存路徑> -t <做種時間> -u <限制上傳速度>


    其中做種時間默認(rèn)設(shè)置的是100s,上傳速度默認(rèn)不限制,限制的速度單位是KB

    下面的機(jī)器,直接可以

    代碼如下:

    python bt.py -d -f <種子文件> -s <文件保存路徑> -t <做種時間>

    只要有一臺機(jī)器完成了,就自動作為種子,在下載的過程中也會上傳,任何一臺機(jī)器都可以作為源服務(wù)器,當(dāng)然了這里面還有中心的tracker服務(wù)器,腳本當(dāng)中,我搭建了一個tracker源服務(wù)器,放到10.0.1.5端口是8760上面,當(dāng)然大家也可以采用opentracker這個軟件自己搭建一個tracker服務(wù)器,修改其中的源代碼對應(yīng)部分,另外考慮到發(fā)布都是私有文件,代碼當(dāng)作已經(jīng)禁止了dht,如果還想更安全,就自己搭建一個私有的tracker server,具體搭建方法就使用一下搜索引擎,查找一下搭建的方法!

    目前基本做到可以使用,后續(xù)考慮更簡單一點(diǎn),采用磁力鏈接的方式,這樣就可以做到不用每臺都要拷貝一個種子文件,采用一個單獨(dú)的命令行就可以發(fā)布整個文件

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    python實(shí)現(xiàn)的一個p2p文件傳輸實(shí)例

    python實(shí)現(xiàn)的一個p2p文件傳輸實(shí)例:考慮到我手上的服務(wù)器逐漸的增多,有時候需要大規(guī)模的部署同一個文件,例如因?yàn)榉奖闶褂胹ystemtap這個工具定位問題,需要把手上幾百臺服務(wù)器同時安裝kernel-debuginfo這個包,原有的方式采用一個源服務(wù)器,采用rsync或者scp之類的文件傳輸方式只能做到一個點(diǎn)
    推薦度:
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 在线亚洲欧美中文精品| 久久精品国产第一区二区三区| 亚洲精品老司机在线观看| 亚洲午夜精品一区二区| 国产精品伦一区二区三级视频| 欧美精品一区二区三区免费观看 | 人妻精品久久久久中文字幕69| 精品一区二区三区高清免费观看 | 久久精品国产精品亚洲| 久久国产精品久久久| 国产欧美日韩精品丝袜高跟鞋 | 精品亚洲成a人片在线观看少妇| 亚洲国产午夜中文字幕精品黄网站| 国产精品乱伦| 亚洲精品高清视频| 亚洲国产精品国自产电影| 国产精品视频免费| 国产精品第12页| 国产午夜无码精品免费看动漫| 亚洲精品你懂的在线观看| 夜夜高潮夜夜爽国产伦精品| 免费精品精品国产欧美在线| 精品国精品国产自在久国产应用男| 91久久精品国产免费直播| 国产精品视频久久久| 91视频精品全国免费观看| 国产国拍亚洲精品mv在线观看| 久久99国产综合精品| 色久综合网精品一区二区| 亚洲精品乱码久久久久久中文字幕| 亚洲国产精品尤物YW在线观看 | 99久久精品午夜一区二区 | 久久久久人妻精品一区二区三区| 真实国产精品vr专区| 中文精品无码中文字幕无码专区| 四虎精品亚洲一区二区三区 | 97精品国产97久久久久久免费| 欧美日韩精品在线| 午夜精品福利视频| 国产精品午夜一级毛片密呀 | avtt天堂网久久精品|