zoukankan      html  css  js  c++  java
  • python网络编程-socket上传下载文件(包括md5验证,大数据发送,粘包处理)

    ftp server

    1) 读取文件名

    2)检查文件是否存在

    3)打开文件

    4)检查文件大小

    5)发送文件大小给客户端

    6)等客户端确认

    7)开始边读边(md5计算)发数据

    8)给客户端发md5

    ftp下载文件
    
    服务器
    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    import socket
    import os
    import hashlib
    server=socket.socket()
    
    server.bind(("127.0.0.1",9999))
    
    server.listen(5)
    
    while True:
        print("等待新指令")
        conn,addr=server.accept()
        print("连接信息",addr)
    
        while True:
            try:
                data=conn.recv(1024)
            except ConnectionResetError as e:
                print(e)
            if not data:            #客户端断开会传个空值过来,会导致进入死循环
                print("客户端断开连接")
                break
    
            cmd,filename=data.decode("utf-8").split()
            print(filename)
    
            if os.path.isfile(filename):
                f=open(filename,'rb')
                m=hashlib.md5() #MD5验证
                file_size=os.stat(filename).st_size #获取文件大小
                conn.send(str(file_size).encode()) #给客户端发送文件大小
    
                conn.recv(1024) #阻塞 因为有两次send,防止出现“粘包”
    
                for line in f:
                    m.update(line)
                    conn.send(line)
                else:
                    f.close()
                    print("file md5 ",m.hexdigest())
            print("send done")
    
            conn.send(m.hexdigest().encode()) #给客户端发送md5验证值
    
    server.close()
    客户端
    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    
    import os
    import socket
    import hashlib
    
    client=socket.socket()
    client.connect(("127.0.0.1",9999))
    
    while True:
        cmd=input(">>:").strip()
        if len(cmd)==0:continue
        if cmd.startswith("get"):
            client.send(cmd.encode("utf-8")) #给服务器端发送命令
    
            response=client.recv(1024) #接受服务器相应:文件大小
    
            total_file_size=int(response.decode("utf-8"))
            client.send(b"read to recv file") #防止粘包,阻塞
            f=open(cmd.split()[1],'wb')
            m=hashlib.md5() #md5验证
            recv_size=0
            while recv_size<total_file_size:
                if total_file_size - recv_size>1024: #判断最后一次接受数据,长度是多少,就收多少,如果还是1024有可能会出现粘包
                    size=1024
                else:
                    size=total_file_size - recv_size
    
                recv_data=client.recv(size)
                f.write(recv_data)
                m.update(recv_data)
                recv_size+=len(recv_data) #要以len来计算,最后一次的数据不一定是1024
            else:
                f.close()
    
            recv_md5=m.hexdigest()
    
            recv_server_md5=client.recv(1024).decode()
    
            print("md5 clinet and server", recv_md5,recv_server_md5)
    上传文件
    客户端
    # -*- coding:utf-8 -*- __author__ = 'shisanjun' import socket import json import os host=("127.0.0.1",9000) client=socket.socket() client.connect(host) while True: cmd_str=input("请输入命令>>").strip() if len(cmd_str)==0:continue cmd_list=cmd_str.split() if cmd_list[0]=="put": if len(cmd_list)==1: print("not find put filename") else: filename=cmd_list[1] if os.path.isfile(filename): file_obj=open(filename,'rb') filename2=filename.split("/")[-1] print(filename2) data_stat="%s %s" %(filename2,os.path.getsize(filename)) data={ "filename":filename2, "filesize":os.path.getsize(filename) } client.send(json.dumps(data).encode("utf-8")) for line in file_obj: client.send(line) file_obj.close() else: print("can not find file") elif cmd_list[0]=="get": pass 服务器端 # -*- coding:utf-8 -*- __author__ = 'shisanjun' import socket import json host=("127.0.0.1",9000) server=socket.socket() server.bind(host) server.listen(5) while True: conn,addr=server.accept() data=conn.recv(4096) print(data.decode("utf-8")) data_dict=json.loads(data.decode("utf-8")) filename=data_dict.get("filename") f=open(filename,"wb") recesize=0 while recesize<data_dict.get("filesize"): recefile=conn.recv(4096) f.write(recefile) recesize+=len(recefile) f.close()
  • 相关阅读:
    GeoServer源码解析和扩展 (三)结构篇
    GeoServer源码解析和扩展 (一)基础篇
    开放GIS标准OGC之路(4)之 解密Filter
    开放GIS标准OGC之路(3)之 WFS初探
    养成重构的习惯有多重要
    使用GeoTools遇到的两个小问题:nvarchar类型字段无法识别,主键字段无法识别
    OGC之路(1) 之 WMS标准学习总结
    移动端flex布局
    推一把随机回帖模块
    用htmlparser来获取你想要的内容
  • 原文地址:https://www.cnblogs.com/lixiang1013/p/7041149.html
Copyright © 2011-2022 走看看