第七周作业——简单FTP
開(kāi)發(fā)簡(jiǎn)單的FTP:
1. 用戶登陸
2. 上傳/下載文件
3. 不同用戶家目錄不同
4. 查看當(dāng)前目錄下文件
5. 充分使用面向?qū)ο笾R(shí)
?
1、目錄結(jié)構(gòu)
zuoye-ftp
├── chenliang #用戶chenliang的FTP根目錄
├── download #所有用戶下載的時(shí)候默認(rèn)文件路徑
├── lw #用戶lw的FTP根目錄
├── lzd #用戶lzd的FTP根目錄
├── wangjun #用戶wangjun的FTP根目錄
├── wdl #用戶wdl的FTP根目錄
├── xueli #用戶xueli的FTP根目錄
├── create-users.py #創(chuàng)建用戶專(zhuān)用py文件
├── ros.zip #模擬上下載的測(cè)試文件ros.zip
├── socket_client.py #客戶端文件
├── socket_server.py #服務(wù)端文件
├── user_data.bak #shelve文件
├── user_data.dat #shelve文件
└── user_data.dir #shelve文件
2、創(chuàng)建用戶運(yùn)行create-users.py,默認(rèn)帳號(hào)密碼是一致的。已有用戶chenliang,lw,lzd,wangjun,wdl,xueli
3、創(chuàng)建的用戶,在執(zhí)行服務(wù)端的時(shí)候,自動(dòng)會(huì)生成一個(gè)自己用戶的FTP根目錄,同時(shí)便于測(cè)試會(huì)復(fù)制ROS.zip到自己根目錄
4、先運(yùn)行socket_server.py,默認(rèn)socket的服務(wù)端端口號(hào)為6969
5、再運(yùn)行socket_client.py
create-users.py
#!/usr/bin/env python #-*-coding:utf-8-*- #Author:lzd #創(chuàng)建用戶名和密碼,默認(rèn)用戶名和密碼一致 import shelve userlist=[] user_data=shelve.open("user_data") # for i in user_data.items(): # print(i) print("當(dāng)前已有的所有用戶的用戶名如下:") for i in user_data.keys():userlist.append(user_data[i]) print(userlist) while True:username=input("請(qǐng)輸入用戶名\n")if username in userlist:print("用戶名重復(fù)啦,請(qǐng)重新輸入用戶名!")continueelse:password=input("請(qǐng)輸入用戶密碼\n")break user_data[username]=password user_data.close() print("用戶創(chuàng)建成功~!")socket_server.py
#!/usr/bin/env python #-*-coding:utf-8-*- #Author:lzd #服務(wù)器端 import os gongzuopath=os.getcwd() # print(gongzuopath) import time #print(time.strftime("%Y%m%d%H%M%S",time.localtime())) import socket server = socket.socket() server.bind(('localhost',6969)) #綁定要監(jiān)聽(tīng)端口 server.listen() #監(jiān)聽(tīng) import shutil import shelve userlist=[] user_data=shelve.open("user_data") for i in user_data.keys():userlist.append(user_data[i])if not os.path.exists(gongzuopath+r"/"+i):os.mkdir(gongzuopath+r"/"+i)if not os.path.exists(gongzuopath+r"/"+i+"/ros.zip"):shutil.copyfile(gongzuopath+r"/ros.zip",gongzuopath+r"/"+i+"/ros.zip") print("我要開(kāi)始等電話了") while True:Flag = Trueconn, addr = server.accept() # 等電話打進(jìn)來(lái)# conn就是客戶端連過(guò)來(lái)而在服務(wù)器端為其生成的一個(gè)連接實(shí)例print(conn, addr)print("電話來(lái)了")while Flag:data = conn.recv(1024)print("recv:",data)if not data:print("client has lost...")breakclientuser=data.decode("utf-8")if clientuser in userlist:conn.send("請(qǐng)輸入用戶密碼".encode("utf-8"))data = conn.recv(1024)print("recv:",data)if not data:print("client has lost...")breakif data.decode("utf-8")==user_data[clientuser]:conn.send("用戶名密碼驗(yàn)證成功".encode("utf-8"))while Flag:data = conn.recv(1024)print("recv:", data)if data=="choose3".encode("utf-8"):if ",".join(os.listdir(gongzuopath+r"/"+clientuser)).encode("utf-8"):conn.send(",".join(os.listdir(gongzuopath+r"/"+clientuser)).encode("utf-8"))else:conn.send("當(dāng)前目錄下為空".encode("utf-8"))elif data=="choose1".encode("utf-8"):conn.send("服務(wù)端準(zhǔn)備接收文件".encode())data = conn.recv(1024).decode("utf-8") #收到文件大小,單位bytefilesize=dataprint("recv:文件大小為", data)tmpdata="服務(wù)端準(zhǔn)備接收大小為"+data+"的文件"conn.send(tmpdata.encode())serverfile=gongzuopath+r"/"+clientuser+"/"+time.strftime("%Y%m%d%H%M%S",time.localtime())f = open(serverfile, "wb")while str(os.stat(serverfile).st_size) != filesize:data=conn.recv(10240000)f.write(data)f.flush()else:conn.send("文件發(fā)送完畢".encode("utf-8"))elif data=="choose2".encode("utf-8"):if ",".join(os.listdir(gongzuopath + r"/" + clientuser)).encode("utf-8"):conn.send(",".join(os.listdir(gongzuopath + r"/" + clientuser)).encode("utf-8"))else:conn.send("當(dāng)前目錄下為空".encode("utf-8"))continuedata = conn.recv(1024).decode("utf-8")print(data)if not data:continueprint("recv:客戶端要下載的文件名", data)fpath=gongzuopath+r"/"+clientuser+r"/"+datafpath_size = str(os.stat(fpath).st_size)f = open(fpath, "rb")filedata = f.read()conn.send(fpath_size.encode("utf-8"))conn.sendall(filedata)data = conn.recv(1024)print(data.decode("utf-8")) # 文件接收完畢elif data=="choose4".encode("utf-8"):Flag=Falseelse:conn.send("用戶名密碼驗(yàn)證失敗".encode("utf-8"))else:conn.send("輸入的用戶名不存在".encode())server.close()socket_client.py
#!/usr/bin/env python #-*-coding:utf-8-*- #Author:lzd #客戶端 import socket import os gongzuopath=os.getcwd() # print(os.stat(gongzuopath+"/lzd/"+"ros.zip").st_size) client = socket.socket() #聲明socket類(lèi)型,同時(shí)生成socket連接對(duì)象 client.connect(('localhost',6969)) while True:username=input("請(qǐng)輸入用戶名\n")if len(username) == 0: continueclient.send(username.encode("utf-8"))data=client.recv(1024)print(data.decode())if data.decode()=="請(qǐng)輸入用戶密碼":password=input("")client.send(password.encode("utf-8"))data=client.recv(1024)print(data.decode())if data.decode()=="用戶名密碼驗(yàn)證失敗":continueelif data.decode()=="用戶名密碼驗(yàn)證成功":while True:print("%s當(dāng)前的工作目錄為/%s"%(username,username))print("""1、上傳文件;2、下載文件;3、查看當(dāng)前目錄下的所有文件;4、退出程序請(qǐng)輸入你想操作的數(shù)字? """)choose=input("")if choose=="1":print("當(dāng)前用戶的工作目錄下所有文件如下:")print(",".join(os.listdir(gongzuopath + r"/" + username)))fpath2=input("請(qǐng)輸入你想上傳到服務(wù)器的文件名,為便于測(cè)試,當(dāng)前目錄下有個(gè)1M的文件ros.zip\n")print("默認(rèn)會(huì)在當(dāng)前用戶的目錄下生成一個(gè)當(dāng)前時(shí)間的文件。")if not fpath2:continuefpath=gongzuopath+r"/"+username+r"/"+fpath2fpath_size=str(os.stat(fpath).st_size)f=open(fpath,"rb")filedata=f.read()client.send("choose1".encode("utf-8"))data = client.recv(1024)print(data.decode("utf-8")) #服務(wù)器準(zhǔn)備接收文件client.send(fpath_size.encode("utf-8"))data = client.recv(1024)print(data.decode("utf-8")) #服務(wù)端準(zhǔn)備接收大小為%s的文件 client.sendall(filedata)data = client.recv(1024)print(data.decode("utf-8")) # 文件發(fā)送完畢if choose=="2":client.send("choose2".encode("utf-8"))data = client.recv(1024)print("您當(dāng)前的工作目錄下,所有的文件如下:")print(data.decode("utf-8")) # 顯示當(dāng)前工作目錄下所有文件if data.decode("utf-8")=="當(dāng)前目錄下為空":continueprint("您想下載哪個(gè)文件到本地?默認(rèn)下載到當(dāng)前腳本的工作目錄的download目錄")fpath2 = input("請(qǐng)輸入你想下載的文件名\n")client.send(fpath2.encode("utf-8"))fpath = gongzuopath + r"/download/" + fpath2data = client.recv(1024).decode("utf-8")file_size=dataprint("您想下載的文件大小為:",data)f = open(fpath, "wb")while str(os.stat(fpath).st_size) != file_size:data = client.recv(10240000)f.write(data)f.flush()else:client.send("文件接收完畢".encode("utf-8"))print("文件接收完畢")if choose=="3":client.send("choose3".encode("utf-8"))data = client.recv(1024)print("您當(dāng)前的工作目錄下,所有的文件如下:")print(data.decode("utf-8"))if choose=="4":client.send("choose4".encode("utf-8"))client.close()exit()?
總結(jié)
以上是生活随笔為你收集整理的第七周作业——简单FTP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最全Kafka 设计与原理详解【2017
- 下一篇: 企业“数据压力锅”即将爆炸,CIO该如何