基于socket的客户端与服务端简单网盘传输实现 #服务端源码#-*-coding:utf-8-*-importsocketimporthashlibimportjsonimportstructimportoswp_file_list=[]#注意列
里是你网盘服务端的文件路径sk=socket.socket()sk.bind(('127.0.0.1',9000))#这里你可以写你主机的ip地址,我这里是将客户端和服务端都部署在本地,所以用了这个回环地址。sk.listen()whileTrue:coon,addr=sk.accept()print(addr)#网盘服务端发送用户登录界面过来user_info={'name':'','password':''}tag1=json.dumps(user_info).encode()tag1_len=len(tag1)coon.send(struct.pack('i',tag1_len))coon.send(tag1)#向客户端发送随机32位字节str_random=os.urandom(32)coon.send(str_random)#收到用户端发送回来的用户密码信息写入user_infoinfo_len=struct.unpack('i',coon.recv(4))[0]user_info=json.loads(coon.recv(info_len).decode())withopen('网盘用户密码库存',encoding='utf-8')asf:#这边的网盘用户密码库存可根据个人想法设置count=0forlineinf:count+=1new_line=line.strip().split('|')sha=hashlib.sha1(str_random)sha.update(new_line[0].encode('utf-8'))username=sha.hexdigest()sha.update(new_line[1].encode('utf-8'))userpwd=sha.hexdigest()ifusername==user_info['name']anduserpwd==user_info['password']:#向客户端发送验证消息msg_len=struct.pack('i',len(json.dumps('登录成功').encode()))coon.send(msg_len)coon.send(json.dumps('登录成功').encode())#接受客户端的下载或者上传指令x_len=struct.unpack('i',coon.recv(4))[0]x=json.loads(coon.recv(x_len).decode())ifx=='下载':wp_size=len(json.dumps(wp_file_list).encode())coon.send(struct.pack('i',wp_size))coon.send(json.dumps(wp_file_list).encode())#收一下客户端要下载的图书idid_len=struct.unpack('i',coon.recv(4))[0]id=json.loads(coon.recv(id_len).decode())forcount,iinenumerate(wp_file_list,1):ifint(id)==count:filesize=os.path.getsize(i)#向客户端发送filesizecoon.send(struct.pack('i',filesize))withopen(i,'rb')asf1:whilefilesize>0:tag=f1.read(1024)filesize-=1024coon.send(tag)elifx=='上传':file_len=struct.unpack('i',coon.recv(4))[0]file_dict=json.loads(coon.recv(file_len).decode())file_path=r'C:\Users\86159\Desktop\图灵\客户端上传文件'#这里是你服务端存放客户端上传文件的路径local_path=os.path.join(file_path,file_dict['name'])iffile_pathinwp_file_list:passelse:withopen(local_path,'wb')asf2:whilefile_dict['size']>0:tag=coon.recv(1024)file_dict['size']-=len(tag)f2.write(tag)else:ifcount<5:continueelse:coon.send('登录失败'.encode())#coon.close()#sk.close()#客户端源码#-*-coding:utf-8-*-importsocketimportjsonimportstructimporthashlibimportossk=socket.socket()sk.connect(('127.0.0.1',9000))#这里和服务端IP地址端口号保持一致#客户端接收服务端发送的用户登录界面tag1_len=struct.unpack('i',sk.recv(4))[0]user_info=json.loads(sk.recv(tag1_len).decode())#获取网盘客户端发送的随机字节str_random=sk.recv(32)name=input('请输入用户名:').strip()password=input('请输入密码:').strip()#将用户信息和随机字节一起加密sha=hashlib.sha1(str_random)sha.update(name.encode('utf-8'))username=sha.hexdigest()sha.update(password.encode('utf-8'))userpwd=sha.hexdigest()user_info['name']=usernameuser_info['password']=userpwd#客户端将加密的用户密码信息发送给网盘服务端info_len=struct.pack('i',len(json.dumps(user_info).encode()))sk.send(info_len)sk.send(json.dumps(user_info).encode())#接收服务端的验证结果msg_len=struct.unpack('i',sk.recv(4))[0]msg=json.loads(sk.recv(msg_len).decode())ifmsg=='登录成功':whileTrue:x=input('下载or上传(按Q或q退出)>>>')ifx=='下载':x_len=len(json.dumps(x).encode())sk.send(struct.pack('i',x_len))sk.send(json.dumps(x).encode())wp_size=struct.unpack('i',sk.recv(4))[0]wp_file_list=sk.recv(wp_size).decode()filename_list=[]forcount,iinenumerate(json.loads(wp_file_list),1):iflen(os.path.basename(i).split('.'))>2:filename_list.append(os.path.basename(i).split('.')[1])print(count,os.path.basename(i).split('.')[1])else:filename_list.append(os.path.basename(i).split('.')[0])print(count,os.path.basename(i).split('.')[0])id=input('请输入下载的文件号>>>')#将id发送给网盘服务端id_len=struct.pack('i',len(id.encode()))sk.send(id_len)sk.send(id.encode())#接受一下服务端的filesizefilesize=struct.unpack('i',sk.recv(4))[0]filepath=input('请输入存放网盘下载文件的地址>>>')local_path=os.path.join(filepath,filename_list[int(id)-1]+'.pdf')withopen(local_path,'wb')asf1:whilefilesize>0:tag=sk.recv(1024)filesize-=len(tag)f1.write(tag)elifx=='上传':x_len=len(json.dumps(x).encode())sk.send(struct.pack('i',x_len))sk.send(json.dumps(x).encode())atr=int(input('按0上传网盘文件,按1上传电脑本地文件,按Q或q退出>>>'))isFlag=TruewhileisFlag:if(atr==0):dump_file_list=['C:\\Users\\86159\\Desktop\\客户端网盘文件\\2019年数据结构A卷.doc','C:\\Users\\86159\\Desktop\\客户端网盘文件\\数据结构
及
.doc']#这里是你客户端上传给服务端的文件地址filename_list=[]forcount,iinenumerate(dump_file_list,1):dic={count:i}filename_list.append(dic)print(count,os.path.basename(i))id=int(input('请输入你想上传的文件号>>>'))file_path=filename_list[id-1][id]else:file_path=input('请输入上传文件的路径>>>')filename=os.path.basename(file_path)filesize=os.path.getsize(file_path)file_dict={'name':filename,'size':filesize}file_len=len(json.dumps(file_dict).encode())sk.send(struct.pack('i',file_len))sk.send(json.dumps(file_dict).encode())withopen(file_path,'rb')asf1:whilefilesize>0:tag=f1.read(1024)filesize-=1024sk.send(tag)elifx.upper()=='Q':breakelse:pass#sk.close()#这里是我网盘用户密码库存的内容老付|zyq1109谢公子|xl0607阿越|hy1234郑某某|lq1010太白|sht1314 -全文完-