• python socket 传送文件


    server :

    # -*- coding: utf-8 -*-
    '''
    实现思路:
        1. 读取从客户端发送过来的文件名
        2.检测文件是否存在
        3.检测文件大小
        4. 发送文件大小给客户端  
        5.等待客户端确认防止粘包
        6.打开文件
        7.开始边读边发数据
        8.关闭文件
        9.发送MD5
    '''
    
    import socket,os,hashlib
    
    server  = socket.socket()
    server.bind(('localhost',9988))
    
    server.listen()
    
    while True:
        conn, addr = server.accept()
        print("new connect:",addr)
        while True:
            data= conn.recv(1024)
            if not data:
                print("客户端已断开")
                break
            cmd,fileName = data.decode().split()
            print("fileName is:",fileName)
            if os.path.isfile(fileName):
                f = open(fileName,"rb")
                m= hashlib.md5()
                #获取文件大小
                file_size = os.stat(fileName).st_size
                
                #向客户端发送文件大小
                conn.send(str(file_size).encode())
                #wait for ack
                conn.recv(1024)
                
                for line in f:
                    # 获取md5
                    m.update(line) 
                    #发送数据
                    conn.send(line)  
                
                print("file md5:",m.hexdigest())
                conn.send(m.hexdigest().encode())
                f.close()
                 
    #             
                
                
    server.close()

    cilent:

    # -*- coding: utf-8 -*-
    
    import socket
    import hashlib
    from fileinput import filename
    client  = socket.socket()
    
    client.connect(('localhost',9988))
    
    while True:
        cmd = input(">>:").strip()
        if len(cmd)==0:continue
        if cmd.startswith("get"):
            client.send(cmd.encode())
            #接收文件大小
            server_response = client.recv(1024)
            print("文件大小:",server_response.decode())
            
            #发送确认
            client.send(b"ok")
            
            file_size = int(server_response.decode())
            received_size =0
            filename = cmd.split()[1]
            f = open(filename+".new","wb")
            m = hashlib.md5()
    #     received_data = b""
            while received_size < file_size:
                buff = 0;
                #只收取文件中的字符
                if file_size-received_size >1024 :
                    buff = 1024
                else:
                    buff = file_size-received_size 
                #接收数据
                cmd_res = client.recv(buff)
                #每次收到的字节数
                received_size = received_size+ len(cmd_res)
                
                m.update(cmd_res)
                #将接收的数据写到文件中
                f.write(cmd_res)
            else:
                print("done")
                f.close()
                new_file_md5 = m.hexdigest()
            
            server_file_md5 = client.recv(1024)
            print("server md5 is :",server_file_md5 )
            print("client md5 is :",new_file_md5 )
    client.close()
  • 相关阅读:
    java里如何使用输入流和输出流实现读取本地文件里内容和写出到本地文件里
    Windows 命令行基础(博主推荐)
    Python2.7编程基础(博主推荐)
    27 个Jupyter Notebook的小提示与技巧
    java里如何实现循环打印出字符或字符数组里的内容
    [转]angularjs之ui-grid 使用详解
    [转]AngularJS 实现 Table的一些操作(示例大于实际)
    [转]js 回车转成TAB(利用tabindex)
    [转] Entity Framework添加记录时获取自增ID值
    [转]使用依赖关系注入在 ASP.NET Core 中编写干净代码
  • 原文地址:https://www.cnblogs.com/gaizhongfeng/p/7999131.html
Copyright © 2020-2023  润新知