• 【小程序】使用socket实现文件的收发


    功能:使用socket实现文件的收发,客户端发送[get 文件名],在客户端接收服务端的文件,接受后校验MD5值。

    client端:

    import socket,hashlib
    
    client=socket.socket()
    
    client.connect(('localhost',9999))
    
    while True:
        msg=input('>>>').strip()
        if len(msg)==0:
            continue
        if msg.startswith('get'):
            client.send(msg.encode('utf-8'))
            server_response=client.recv(1024)
            print('file size:',server_response.decode())
            client.send('...'.encode('utf-8'))
            file_total_size=int(server_response.decode())
            recv_size=0
            filename=msg.split()[1]
            f=open(filename+'_new','wb')
            m=hashlib.md5()
    
            while recv_size<file_total_size:
                data=client.recv(1024)
                recv_size+=len(data)
                f.write(data)
                m.update(data)
                print('recv:%d/%d'%(recv_size,file_total_size))
            else:
                print('recv done...')
                f.close()
                new_file_md5=m.hexdigest()
                client.send('recv done'.encode('utf-8'))
                server_files_md5=client.recv(1024).decode()
                print('server_files_md5:',server_files_md5)
                print('new_file_md5:',new_file_md5)
    
    client.close()

    server端:

    import socket,os,hashlib
    
    server=socket.socket()
    server.bind(('localhost',9999))
    print('waiting...')
    server.listen()
    while True:
        conn,addr=server.accept()
        print('new conn:',addr)
        while True:
            data=conn.recv(1024).decode()
            if not data:
                print('客户端断开...')
                break
            print('data',data)
            cmd,filename=data.split()
            print('cmd:',cmd)
            print('filename:',filename)
            if os.path.isfile(filename):
                file_size=os.stat(filename).st_size
                conn.send(str(file_size).encode('utf-8'))
                conn.recv(1024).decode()#防粘包
                f = open(filename,'rb')
                m=hashlib.md5()
                for line in f:
                    m.update(line)
                    conn.send(line)#按行发送
                    res_md5=m.hexdigest()
                print('MD5:',res_md5)
                f.close()
                conn.recv(1024).decode()#防粘包
                conn.send(res_md5.encode('utf-8'))#发送MD5
    
    
            print('send done')
    
    server.close()
  • 相关阅读:
    Kaffeine Player:固守丰富的媒体播放器
    GIMP 2.2.15
    基于终真个常用工具
    运用 GNOME Specimen 检查字体
    LINA:让 Linux 使用法度圭表标准在 Windows 和 Mac OS X 上运转
    Openbox 3.4 公布
    DB2 9 运用拓荒(733 查验)认证指南,第 1 局部: 数据库器材与编程步伐(1)
    Wammu-挪动电话治理器
    会计人员必去十大网站(最新)
    判断一个数组的长度用 Length 还是 SizeOf ?
  • 原文地址:https://www.cnblogs.com/q1ang/p/9118917.html
Copyright © 2020-2023  润新知