zoukankan      html  css  js  c++  java
  • 【小程序】使用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()
  • 相关阅读:
    使用线程池对应用程序产生线程个数与占用CPU时间的影响
    枚举类型解析
    性能监视器的简单使用
    WCF 承载服务
    ManulResetEvent与AutoResetEvent
    获取当前目录的上级目录
    WCF 异步调用
    适配器设计模式
    控制控制台自身的最大化最小化
    代码自动生成技术相关介绍
  • 原文地址:https://www.cnblogs.com/q1ang/p/9118917.html
Copyright © 2011-2022 走看看