ftp上传下载

#server端
import socket
import struct
import json
import hashlib
import os
import sys
ipaddr = '127.0.0.1'
port = 9001
file_list = [r'C:\Users\lyq\PycharmProjects\untitled\server file\test1.txt',
                     r'C:\Users\lyq\PycharmProjects\untitled\server file\test2.txt',]


def send_dict(sk,dict1): #发送dict
    json_dict = json.dumps(dict1)  # dumps 完以后是个str
    len_json_dict = struct.pack('i', len(json_dict))
    sk.send(len_json_dict)
    sk.send(json_dict.encode('utf-8'))

def recv_dict(sk):
    len_json_dict = conn.recv(4)
    len = struct.unpack('i', len_json_dict)[0]
    json_dict = conn.recv(len).decode('utf-8')
    dict = json.loads(json_dict)
    return dict

def is_user(name,pwd): #判断账号密码是否存在系统里 md5加盐 加密 创建个user.info 
    m = hashlib.md5(name.encode('utf-8'))
    m.update(pwd.encode('utf-8'))
    md5_pwd = m.hexdigest()
    flag = False
    with open('user.info') as f1:
        for line in f1:
            name1,pwd1 = line.split('|')
            if name1.strip() == name and pwd1.strip() == md5_pwd:
                flag = True
                break
    return flag

def download(conn,dict3):
    file_len = os.path.getsize(dict3['file_path'])
    blen_file = struct.pack('i', file_len)
    conn.send(blen_file)
    with open(dict3['file_path'], mode='rb') as f1:
        file_size = os.path.getsize(dict3['file_path'])
        while file_size > 0:
            content = f1.read(1024)
            conn.send(content)
            file_size -= 1024

sk = socket.socket()
sk.bind((ipaddr,port))
sk.listen()

conn,_ = sk.accept()
while 1:
    dict1 = recv_dict(conn)
    if is_user(dict1['name'],dict1['pwd']):
        dict2 = {'operate':'login','result':1}
        send_dict(conn, dict2)#登录成功
        #成功就可以下载和上传
        while 1:
            dict3 = recv_dict(conn)

            if dict3['operate']=='file_list': #发送下载列表
                print('执行我了')
                send_dict(conn,file_list)
            elif dict3['operate'] == 'download': #下载
                download(conn,dict3)
            else:pass #上传
    else:
        dict2 = {'operate': 'login', 'result': 0}
        send_dict(conn, dict2)
conn.close()

sk.close()
#client端
import socket
import struct
import json
import os
ipaddr = '127.0.0.1'
port = 9001
operate_list = ['download','upload']

def send_dict(sk,dict1):
    json_dict = json.dumps(dict1)  # dumps 完以后是个str
    len_json_dict = struct.pack('i', len(json_dict))
    sk.send(len_json_dict)
    sk.send(json_dict.encode('utf-8'))

def recv_dict(sk):
    len_json_dict = sk.recv(4)
    len = struct.unpack('i', len_json_dict)[0]
    json_dict = sk.recv(len).decode('utf-8')
    dict = json.loads(json_dict)
    return dict

sk = socket.socket()
sk.connect((ipaddr,port))
while 1:
    name = input('name:')
    pwd = input('pwd:')
    dict1 = {'name':name,'pwd':pwd}
    send_dict(sk,dict1)
    dict2 = recv_dict(sk)
    if dict2['result']:#登录成功就可以下载或者上传了 ,无限
        while 1:
            for num,operate in enumerate(operate_list,1):
                print(num,operate)
            num = input('输入你的选择:')
            if int(num) == 1:#下载
                #发送下载请求,获取文件列表
                dict3 = {'operate':'file_list'}
                send_dict(sk,dict3)
                file_list = recv_dict(sk)
                for num,file_path in enumerate(file_list,1):
                    print(num,file_path)
                while 1:
                    #输入文件序号,进行下载

                    num = input('输入你要下载的文件序号:')
                    if num.upper() == 'Q': break
                    dict3 = {'operate':'download','file_path':file_list[int(num)-1]}
                    send_dict(sk,dict3)
                    blen_file = sk.recv(4)
                    file_len = struct.unpack('i',blen_file)[0]
                    print(os.path.basename(file_list[int(num)-1]))
                    with open(os.path.basename(file_list[int(num)-1]),mode='wb') as f1:
                        while file_len>0:
                            f1.write(sk.recv(1024))
                            file_len-=1024

            elif int(num) == 2:#上传
                pass
            else:pass #退出


    else:print('登录失败!')

sk.close()



posted on 2020-08-10 22:25  94小渣渣  阅读(120)  评论(0)    收藏  举报