登錄作業,完成上傳下載


server.py:

import socket
import json,hashlib
import struct,os,sys

def my_send(conn,dic):
str_dic=json.dumps(dic)
b_dic=str_dic.encode('utf-8')
mlen=struct.pack('i',len(b_dic))
conn.send(mlen)
conn.send(b_dic)

def my_recv(conn):
mlen=conn.recv(4)
len_dic=struct.unpack('i',mlen)[0]
str_dic=conn.recv(len_dic).decode('utf-8')
dic=json.loads(str_dic)
return dic

def get_md5(name,password):
md5=hashlib.md5(name.encode('utf-8'))
md5.update(password.encode('utf-8'))
return md5.hexdigest()

def upload():
dic=my_recv(conn)
with open(dic['filename'],mode='wb') as f:
while dic['filesize']>0:
content=conn.recv(1024)
dic['filesize']-=len(content)
f.write(content)

def dowload():
abs_path=r"J:\迅雷下載\2\HEYZO-2064 顔射でどろべちゃ!ぶっかけ祭り!!Vol.4 – メイリン.mp4"
filename=os.path.basename(abs_path)
filesize=os.path.getsize(abs_path)
dic={'filename':filename,'filesize':filesize}
my_send(conn,dic)
with open(abs_path,mode='rb') as f:
while filesize>0:
content=f.read(1024)
filesize-=len(content)
conn.send(content)

def login(conn):
flag=True
while flag:
msg=my_recv(conn)
with open(r'D:\untitled9\userinfo','r',encoding='utf-8') as f:
for line in f :
name,pwd=line.strip().split('|')
if name==msg['username'] and pwd==get_md5(name,msg['password']):
res,flag=True,False
break
else:
res=False
dic={'operate':'login','result':res}
my_send(conn,dic)

sk=socket.socket()
sk.bind(('127.0.0.1',8009))
sk.listen()
conn,_=sk.accept()

login(conn)
opt=conn.recv(1024).decode('utf-8') #接收用戶選擇。
if hasattr(sys.modules[__name__],opt):
getattr(sys.modules[__name__],opt)()

conn.close()
sk.close()

# 無論在客戶端還是服務端,dowload和upload都不需要傳參。
# my_recv()必須要有返回值。
# 必須發送、接收用戶的選擇數據。


client.py:
import socket
import os,sys
import json
import struct

def my_recv(sk):
mlen=sk.recv(4)
len_dic=struct.unpack('i',mlen)[0]
str_dic=sk.recv(len_dic).decode('utf-8')
dic=json.loads(str_dic)
return dic #注意:必須有返回值。

def my_send(sk,dic):
str_dic=json.dumps(dic)
b_dic=str_dic.encode('utf-8')
mlen=struct.pack('i',len(b_dic))
sk.send(mlen)
sk.send(b_dic)

def upload():
abs_path=r"D:\BaiduYunDownload\厲害了!教你用手機拍出格的照片(完結)\第9期\第9期文藝清新照片攻略.mp4"
filename=os.path.basename(abs_path)
filesize=os.path.getsize(abs_path)
dic={'filename':filename,'filesize':filesize}
my_send(sk,dic)
with open(abs_path,mode='rb') as f:
while filesize>0:
content=f.read(1024)
filesize-=len(content)
sk.send(content)

def dowload():
opt_dic={'operate':'dowload'}
my_send(sk,opt_dic)
msg=my_recv(sk)
with open(msg['filename'],mode='wb') as f:
while msg['filesize']>0:
content=sk.recv(1024)
msg['filesize']-=len(content)
f.write(content)

def login(sk):
while True:
usr=input('請輸入用戶名:').strip()
pwd=input(('請輸入密碼:')).strip()
dic={'username':usr,'password':pwd}
my_send(sk,dic)
dic=my_recv(sk)
if dic['operate']=='login' and dic['result']:
print('登陸成功!')
break
else:
print('登錄失敗,請檢查后輸入。')

sk=socket.socket()
sk.connect(('127.0.0.1',8009))

login(sk)

opt_lst=['upload','dowload']
for index,opt in enumerate(opt_lst,1):
print(index,opt)
num=int(input('請選擇你要操作的序號:'))
sk.send(opt_lst[num-1].encode('utf-8'))#發送用戶選擇給服務器。
getattr(sys.modules[__name__],opt_lst[num-1])()

sk.close()

尚未完成發送文件目錄,選擇文件的功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM