zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    php之面向对象(2)
    PHP ON 阿里云的环境配置攻略
    InitPHP框架搭建高可用WEB应用
    PHP移动互联网开发笔记(6)——MySQL数据库基础回顾[1]
    5 个不用 Bootstrap 的理由
    http中get与post的区别
    django的CSRF保护机制
    博客园项目开发中的难点
    centos7.5静态网页基于nginx建站(python3.6 mysql5.7 nginx安装以及配置)
    python3面向对象常用特性知识点
  • 原文地址:https://www.cnblogs.com/gaizhongfeng/p/7999131.html
Copyright © 2011-2022 走看看