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()
尚未完成發送文件目錄,選擇文件的功能。