sever端
#Author:YuSong
import os
import sys
import json
import hashlib
import struct
import socketserver
class Mysever(socketserver.BaseRequestHandler):
path1 = r'C:\Users\86178\Desktop\考研辅导'
@staticmethod
def sha(username): #加密
key = hashlib.sha1('淞哥专用'.encode('utf-8'))
key.update(username.encode('utf-8'))
return key.hexdigest()
@classmethod
def show_file(cls, path1): # 显示文件夹中的文件
l = []
if os.path.isdir(path1):
name_list = os.listdir(path1)
for i in name_list:
abs_path = os.path.join(path1, i)
if os.path.isfile(abs_path):
l.append(abs_path)
elif os.path.isdir(abs_path):
cls.show_file(abs_path)
else:
l.append(path1)
return l
@staticmethod
def send(conn, info): # 发送
info_len = struct.pack('i', len(info.encode('utf-8')))
conn.send(info_len)
conn.send(info.encode('utf-8'))
@staticmethod
def recv(conn): # 接收
msg_len = conn.recv(4)
length = struct.unpack('i', msg_len)
msg = conn.recv(length[0]).decode('utf-8')
return msg
@classmethod
def download(cls,conn): # 下载
ret = cls.show_file(cls.path1)
ret = json.dumps(ret)
cls.send(conn, ret)
msg_len = conn.recv(4)
length = struct.unpack('i', msg_len)
msg = conn.recv(length[0]).decode('utf-8')
msg = json.loads(msg)
with open(msg['filename'], mode='rb') as f:
while msg['filesize'] > 0:
content = f.read(1024)
msg['filesize'] -= 1024
conn.send(content)
@staticmethod
def upload(conn): # 上传
msg_len = conn.recv(4)
length = struct.unpack('i', msg_len)
msg = conn.recv(length[0]).decode('utf-8')
msg = json.loads(msg)
with open(os.path.basename(msg['filename']), mode='wb') as f1:
while msg['filesize'] > 0:
content = conn.recv(1024)
msg['filesize'] -= len(content)
f1.write(content)
def handle(self): #主程序
conn=self.request
while 1:
flag1=True
while flag1:
info='欢迎登录系统'
Mysever.send(conn,info)
msg=Mysever.recv(conn)
ret = Mysever.sha(msg)
with open('login', encoding='utf-8', mode='r') as f:
for line in f:
if ret == line.strip():
ret,flag1=True,False
break
else:
flag1,ret=False,False
flag = {'operate': 'login', 'state': ret}
flag = json.dumps(flag)
Mysever.send(conn,flag)
flag4=True #退出标志
while flag4:
msg1=Mysever.recv(conn)
if hasattr(self, msg1):
getattr(self, msg1)(conn)
else:
flag4=False
conn.close()
sever=socketserver.ThreadingTCPServer(('127.0.0.1',9001),Mysever)
sever.serve_forever()
client端
#Author:YuSong
import os
import sys
import json
import hashlib
import socket
import struct
sk=socket.socket()
sk.connect(('127.0.0.1',9001))
def MD5(username,password): #加密
md5=hashlib.md5(username.encode('utf-8'))
md5.update(password.encode('utf-8'))
return md5.hexdigest()
def standard(path): #常规操作
filename=os.path.basename(path)
filesize = os.path.getsize(path)
dic1 = {'filename': path, 'filesize': filesize}
str_dic1 = json.dumps(dic1).encode('utf-8')
dic1_len = struct.pack('i', len(str_dic1))
sk.send(dic1_len)
sk.send(str_dic1)
return filename,dic1
def download(sk,path1): #下载
filename,dic1=standard(path1)
with open(filename,mode='wb') as f1:
while dic1['filesize']>0:
content=sk.recv(1024)
dic1['filesize']-=len(content)
f1.write(content)
def upload(sk,path1): #上传
ret = show_file(path1)
for index, a in enumerate(ret, 1):
print(index, os.path.basename(a))
num1 = int(input('>>>>>'))
path=ret[num1 - 1]
filename,dic1 =standard(path)
with open(path,mode='rb') as f:
while dic1['filesize']>0:
content=f.read(1024)
dic1['filesize']-=1024
sk.send(content)
def show_file(path1): #显示文件夹
l = []
if os.path.isdir(path1):
name_list=os.listdir(path1)
for i in name_list:
abs_path=os.path.join(path1,i)
if os.path.isfile(abs_path):
l.append(abs_path)
elif os.path.isdir(abs_path):
show_file(abs_path)
else:
l.append(path1)
return l
def send(sk,ret): #发送
ret=ret.encode('utf-8')
ret_len = struct.pack('i', len(ret))
sk.send(ret_len)
sk.send(ret)
def recv(sk): #接收
msg_len = sk.recv(4)
length = struct.unpack('i', msg_len)
msg = sk.recv(length[0]).decode('utf-8')
return msg
def func():
flag3=True
while flag3:
msg=recv(sk)
if msg=='欢迎登录系统':
print('\033[33m %s \033[0m'%msg)
usr=input('请输入您的用户名:')
psd=input('请输入您的密码:')
ret=MD5(usr,psd)
send(sk,ret)
else:
msg=json.loads(msg)
while msg['state']:
opt_lst=[('上传','upload'),('下载','download')]
for index,(a,b) in enumerate(opt_lst,1):
print(index,a)
num=input('>>>>>')
if num.isdecimal():
num=int(num)
if 0
if hasattr(sys.modules[__name__],opt_lst[num-1][1]):
send(sk, opt_lst[num - 1][1])
if opt_lst[num-1][1]=='upload':
path1=input('请输入你想要上传的文件的地址:')
else:
lst=recv(sk)
lst=json.loads(lst)
for index,a in enumerate(lst, 1):
print(index, os.path.basename(a))
num1= int(input('>>>>>'))
path1= lst[num1 - 1]
getattr(sys.modules[__name__],opt_lst[num - 1][1])(sk,path1)
else:
print('请输入一个范围内的数!!!')
elif num.upper()=='Q': #退出键
msg['state']=False
send(sk,'False')
flag3=False
sk.close()
else:
print('请输入数字')
# path1=r'C:\Users\86178\Desktop'----->测试用
if __name__ == '__main__':
func()