• Socket_FTP


    1. md5加密回顾:

    import hashlib
    
    m=hashlib.md5() #创建md5对象
    m.update(b'abcd') #生成加密串
    m.update(b'efg')
    print(m.hexdigest()) #打印加密串
    m2=hashlib.md5()
    m2.update(b'abcdefg')
    print(m2.hexdigest())
    
    7ac66c0f148de9519b8bd264312c4d64
    7ac66c0f148de9519b8bd264312c4d64
    
    FTP-Server
    1.读取文件名 
    2.检测文件是否存在
    3.打开文件
    4.检测文件大小
    5.发送文件大小给客户端
    6.等待客户端确定,防止粘包
    7.开始边读边发数据
    8.发送md5
    9.关闭文件

     2. FTP入门版:

    服务器端:

    import socket,os,time,hashlib
    
    server=socket.socket()
    server.bind(('localhost',9999))
    server.listen()
    while True:
        conn,addr=server.accept()
        print("new connection is :",addr)
        while True:
            data=conn.recv(1024)
            if not data:
                print("客户端已经断开")
                break
            cmd,filename=data.decode().split()  #分割get hash.py,把get赋值给cmd,把hash.py赋值给filename
            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) #等待客户端的确认
                for line in f:               
                    conn.send(line)          
                f.close()
    
    server.close()
    

     客户端:

    import socket
    
    client=socket.socket()
    client.connect(('localhost',9999))
    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:",server_response) 
            client.send(b'ready to recv file') #给服务器端发确认信息,已经收到文件大小
            file_total_size=int(server_response.decode())
            received_size=0
            filename=cmd.split()[1]
            f=open(filename+'.new','wb') #以二进制打开一个文件,只用于写入。
            while received_size<file_total_size:
                data=client.recv(1024)
                received_size=received_size+len(data)
                f.write(data)
                print(file_total_size,received_size)
            else:
                print('file recv done')
                f.close()
    
    
    client.close()
    

     客户端的输入及运行结果:

    >>:get hash.py
    server response: b'211'
    211 211
    file recv done
    >>:
    

     服务器端的运行结果:

    new connection is : ('127.0.0.1', 65194)
    hash.py
    

     3. FTP+MD5验证

    服务器端:

    import socket,os,time,hashlib
    
    server=socket.socket()
    server.bind(('localhost',9999))
    server.listen()
    while True:
        conn,addr=server.accept()
        print("new connection is :",addr)
        while True:
            data=conn.recv(1024)
            if not data:
                print("客户端已经断开")
                break
            cmd,filename=data.decode().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) #等待客户端的确认
                for line in f:
                    m.update(line) #生产加密串
                    conn.send(line)
                print('file md5',m.hexdigest())
                f.close()
                conn.send(m.hexdigest().encode('utf-8')) #send md5
    
    server.close()
    

     客户端:

    import socket,hashlib
    import hashlib
    
    client=socket.socket()
    client.connect(('localhost',9999))
    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:",server_response) #接收的是文件大小
            client.send(b'ready to recv file')
            file_total_size=int(server_response.decode())
            received_size=0
            filename=cmd.split()[1]
            f=open(filename+'.new','wb')
            m=hashlib.md5()
    
            while received_size<file_total_size:
                data=client.recv(1024)
                received_size=received_size+len(data)
                f.write(data)
                m.update(data)
                #print(file_total_size,received_size)
            else:
                new_file_md5=m.hexdigest()
                print('file recv done',received_size,file_total_size)
                f.close()
            server_file_md5=client.recv(1024)
            print('server file md5:',server_file_md5)
            print('client file md5:',new_file_md5)
    
    client.close()
    

     服务器端运行结果:

    new connection is : ('127.0.0.1', 65466)
    hash.py
    file md5 5dbf115019480585de4d39cd175184db
    

     客户端运行结果:

    >>:get hash.py
    server response: b'211'
    file recv done 211 211
    server file md5: b'5dbf115019480585de4d39cd175184db'
    client file md5: 5dbf115019480585de4d39cd175184db
    

     4.FTP+MD5验证+粘包处理:

    服务器端:

    import socket,os,time,hashlib
    
    server=socket.socket()
    server.bind(('localhost',9999))
    server.listen()
    while True:
        conn,addr=server.accept()
        print("new connection is :",addr)
        while True:
            data=conn.recv(1024)
            if not data:
                print("客户端已经断开")
                break
            cmd,filename=data.decode().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) #等待客户端的确认
                for line in f:
                    m.update(line) #生产加密串
                    conn.send(line)
                print('file md5',m.hexdigest())
                f.close()
                conn.send(m.hexdigest().encode('utf-8')) #send md5
    
    server.close()
    

     客户端:

    import socket,hashlib
    import hashlib
    
    client=socket.socket()
    client.connect(('localhost',9999))
    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:",server_response) #接收的是文件大小
            client.send(b'ready to recv file')
            file_total_size=int(server_response.decode())
            received_size=0
            filename=cmd.split()[1]
            f=open(filename+'.new','wb')
            m=hashlib.md5()
    
            while received_size<file_total_size:
                if file_total_size-received_size>1024: #要收不止一次
                    size=1024
                else: #最后一次了,剩多少收多少
                    size=file_total_size-received_size
                    print("last receive:",size)
                data=client.recv(size)
                received_size=received_size+len(data)
                f.write(data)
                m.update(data)
                #print(file_total_size,received_size)
            else:
                new_file_md5=m.hexdigest()
                print('file recv done',received_size,file_total_size)
                f.close()
            server_file_md5=client.recv(1024)
            print('server file md5:',server_file_md5)
            print('client file md5:',new_file_md5)
    
    client.close()
    

     服务器端的输出:

    new connection is : ('127.0.0.1', 56460)
    hash.py
    file md5 5dbf115019480585de4d39cd175184db
    

     客户端的输出:

    >>:get hash.py
    server response: b'211'
    last receive: 211
    last receive: 2
    file recv done 211 211
    server file md5: b'5dbf115019480585de4d39cd175184db'
    client file md5: 5dbf115019480585de4d39cd175184db
    
  • 相关阅读:
    [C#] 走进异步编程的世界
    [C#] C# 知识回顾
    [C#] 走进异步编程的世界
    [C#] 走进异步编程的世界
    [.Net] 手把手带你将自己打造的类库丢到 NuGet 上
    [.NET] WebApi 生成帮助文档及顺便自动创建简单的测试工具
    [C#] Linq To Objects
    [C#] Linq To Objects
    T-SQL:毕业生出门需知系列(九)
    TortoiseGit:记住用户名和密码
  • 原文地址:https://www.cnblogs.com/momo8238/p/7305601.html
Copyright © 2020-2023  润新知