zoukankan      html  css  js  c++  java
  • 基于TCP协议传输文件

    基于TCP协议传输文件

    '''
    版本一:
    此版本一次写入整个文件大小,
    只能传输小文件,大文件可能会传不全
    '''
    #server端----------------------------------------------
    import socket
    import json
    sk = socket.socket()
    sk.bind(('127.0.0.1',9001))
    sk.listen()
    
    con,addr = sk.accept()
    msg = con.recv(1024).decode('utf-8')
    dic = json.loads(msg)
    
    with open(dic['filename'],mode='wb') as f :
        content = con.recv(dic['filesize'])
        print('--->',len(content))
        f.write(content)
    con.close()
    sk.close()
    #client端————————————————————————————————————————————————
    import os
    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',9001))
    
    #获取文件名|文件小
    abs_path = r'D:Wang.YHVideos人民至上.mp4'
    filename = os.path.basename(abs_path)
    filesize = os.path.getsize(abs_path)
    dic = {'filename':filename,
           'filesize':filesize}
    
    str_dic = json.dumps(dic)
    sk.send(str_dic.encode('utf-8'))
    
    with open(abs_path,mode='rb') as f:
        content = f.read()
        sk.send(content)
    sk.close()
    
    '''
    版本二:
    分次传输文件
    不足:可能会产生粘包现象
    '''
    #serfer端——————————————————————————————————————
    import socket
    import json
    sk = socket.socket()
    sk.bind(('127.0.0.1',9001))
    sk.listen()
    
    con,addr = sk.accept()
    msg = con.recv(1024).decode('utf-8')
    dic = json.loads(msg)
    with open(dic['filename'],mode='wb') as f:
        while dic['filesize'] >0:
            content = con.recv(1024)
            dic['filesize'] -=len(content)
            f.write(content)
    con.close()
    sk.close()
    #client端————————————————————————————————————————————————
    import os
    import socket
    import json
    sk = socket.socket()
    sk.connect(('127.0.0.1',9001))
    #获取文件名|文件小
    abs_path = r'D:Wang.YHVideos人民至上.mp4'
    filename = os.path.basename(abs_path)
    filesize = os.path.getsize(abs_path)
    dic = {'filename':filename,
           'filesize':filesize}
    
    str_dic = json.dumps(dic)
    sk.send(str_dic.encode('utf-8'))
    
    with open(abs_path,mode='rb') as f:
        while filesize >0:
            content = f.read(1024)
            filesize -= len(content)
            sk.send(content)
    sk.close()
    
    '''
    版本三:
    解决粘包
    '''
    #server端————————————————————————————————————————
    import socket
    import json
    import struct
    sk = socket.socket()
    sk.bind(('127.0.0.1',9001))
    sk.listen()
    
    con,addr = sk.accept()
    
    msg_len = con.recv(4)
    dic_len = struct.unpack('i',msg_len)[0]
    msg = con.recv(dic_len).decode('utf-8')
    dic = json.loads(msg)
    
    
    with open(dic['filename'],mode='wb') as f:
        while dic['filesize'] >0:
            content = con.recv(1024)
            dic['filesize'] -=len(content)
            f.write(content)
    
    con.close()
    sk.close()
    
    #client端——————————————————————————————————
    import os
    import socket
    import json
    import struct
    
    sk = socket.socket()
    sk.connect(('127.0.0.1',9001))
    
    #获取文件名|文件小
    abs_path = r'D:Wang.YHVideos人民至上.mp4'
    filename = os.path.basename(abs_path)
    filesize = os.path.getsize(abs_path)
    dic = {'filename':filename,
           'filesize':filesize}
    
    str_dic = json.dumps(dic)
    b_dic = str_dic.encode('utf-8')
    mlen = struct.pack('i',len(b_dic))
    sk.send(mlen)
    sk.send(b_dic)
    
    with open(abs_path,mode='rb') as f:
        while filesize >0:
            content = f.read(1024)
            filesize -= len(content)
            sk.send(content)
    
    sk.close()
    
  • 相关阅读:
    linux 用户、组,修改文件权限
    linux下获取帮助
    PHPSESSID的cookie//session_start()
    【python】import 模块、包、第三方模块
    python练习——最长的递减子序列
    python练习——水仙花数
    Linux目录结构
    Scala入门3(特质线性化)
    Scala入门2(特质与叠加在一起的特质)
    人工智能我见及特征提取mfcc算法理解
  • 原文地址:https://www.cnblogs.com/wyh0717/p/13330605.html
Copyright © 2011-2022 走看看