为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于socket的客户端与服务端简单网盘传输实现

2023-06-27 5页 doc 36KB 1阅读

用户头像 个人认证

is_856463

暂无简介

举报
基于socket的客户端与服务端简单网盘传输实现     基于socket的客户端与服务端简单网盘传输实现                  #服务端源码#-*-coding:utf-8-*-importsocketimporthashlibimportjsonimportstructimportoswp_file_list=[]#注意列表里是你网盘服务端的文件路径sk=socket.socket()sk.bind(('127.0.0.1',9000))#这里你可以写你主机的ip地址,我这里是将客户端和服务端都部署在本地,所以用了这个回环地址。sk.listen()whil...
基于socket的客户端与服务端简单网盘传输实现
     基于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 -全文完-
/
本文档为【基于socket的客户端与服务端简单网盘传输实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索