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()