liliudong

server

import socket
import struct
import hashlib
import os

host = \'127.0.0.1\'
port = 8080
buffer_size = 1024
head_strut = \'128sq32s\' #格式 file_name, file_size, md5 128+8+32
path = \'/Users/apple/Desktop/test.mp4\'
info_size = struct.calcsize(head_strut)

#md5的编译
def compile_md5(path):
    file_size = os.path.getsize(path)
    md5 = hashlib.md5()
    readed_size = 0
    with open(path, \'rb\') as f:
        while readed_size < file_size:
            remain_size = file_size - readed_size
            read_size = buffer_size if buffer_size < remain_size else remain_size
            readed_size += read_size
            md5.update(f.read(read_size))
    md = md5.hexdigest()
    return md

#将struct翻译回来
def unpack_recv(recv_info):
    file_name, file_size, md5 = struct.unpack(head_strut, recv_info)
    return file_name, file_size, md5

def main():
    sk = socket.socket()
    sever_address = (host, port)
    sk.bind(sever_address)
    sk.listen()
    conn, addr = sk.accept()
    print(\'端口{}客户端连接成功\'.format(addr[1]))

    recv_info = conn.recv(info_size)  # 接收长度信息
    file_name, file_size, md5_info = unpack_recv(recv_info)

    recved_size = 0
    with open(path, \'wb\') as f:
        while recved_size < file_size:
            remain_size = file_size - recved_size
            recv_size = buffer_size if buffer_size < remain_size else remain_size
            recved_size += recv_size
            info = conn.recv(recv_size)   #接收相应长度的数据
            f.write(info)   #将接受的数据写入指定位置
    md5 = compile_md5(path)
    if md5 == md5_info.decode(\'utf-8\'):
        print(\'文件校验正确,确认传输完成!\')
    else:
        print(\'文件校验失败!\', md5)

    conn.close()
    sk.close()

if __name__ == \'__main__\':
    main()
------------------------------------------------
------------------------------------------------
#client
import socket
import struct
import os
import hashlib


host = \'127.0.0.1\'
port = 8080
head_struct = \'128sq32s\'
buffer_size = 1024
path = \'/Users/apple/Desktop/vido/day33/03 python fullstack s9day33 黏包现象.mp4\'

#过去md5
def get_md5(path):
    file_size = os.path.getsize(path)
    md5 = hashlib.md5()
    readed_size = 0
    with open(path, \'rb\') as f:
        while readed_size < file_size:
            remain_size = file_size - readed_size
            read_size = buffer_size if buffer_size < remain_size else remain_size
            readed_size += read_size
            md5.update(f.read(read_size))
    md = md5.hexdigest()
    return md

#获取file_name, file_size, md5值
def get_value(path):
    file_name = os.path.basename(path)
    file_size = os.path.getsize(path)
    md = get_md5(path)
    return file_name, file_size, md

def main():
    sk = socket.socket()
    sk.connect((host, port))

    file_name, file_size, md = get_value(path)
    print(type(file_name), type(file_size), type(md))
    struct_info = struct.pack(head_struct, bytes(file_name, encoding=\'utf-8\'), file_size, bytes(md, encoding=\'utf-8\'))
    sk.send(struct_info)

    sended_size = 0
    with open(path, \'rb\') as f:
        while sended_size < file_size:
            remain_size = file_size - sended_size
            send_size = buffer_size if buffer_size < remain_size else buffer_size
            sended_size += send_size
            send_info = f.read(send_size)
            sk.send(send_info)

        print(\'文件传输结束\', md)

    sk.close()

if __name__ == \'__main__\':
    main()

分类:

技术点:

相关文章: