第七周作业——简单FTP
開發簡單的FTP:
1. 用戶登陸
2. 上傳/下載文件
3. 不同用戶家目錄不同
4. 查看當前目錄下文件
5. 充分使用面向對象知識
?
1、目錄結構
zuoye-ftp
├── chenliang #用戶chenliang的FTP根目錄
├── download #所有用戶下載的時候默認文件路徑
├── lw #用戶lw的FTP根目錄
├── lzd #用戶lzd的FTP根目錄
├── wangjun #用戶wangjun的FTP根目錄
├── wdl #用戶wdl的FTP根目錄
├── xueli #用戶xueli的FTP根目錄
├── create-users.py #創建用戶專用py文件
├── ros.zip #模擬上下載的測試文件ros.zip
├── socket_client.py #客戶端文件
├── socket_server.py #服務端文件
├── user_data.bak #shelve文件
├── user_data.dat #shelve文件
└── user_data.dir #shelve文件
2、創建用戶運行create-users.py,默認帳號密碼是一致的。已有用戶chenliang,lw,lzd,wangjun,wdl,xueli
3、創建的用戶,在執行服務端的時候,自動會生成一個自己用戶的FTP根目錄,同時便于測試會復制ROS.zip到自己根目錄
4、先運行socket_server.py,默認socket的服務端端口號為6969
5、再運行socket_client.py
create-users.py
#!/usr/bin/env python #-*-coding:utf-8-*- #Author:lzd #創建用戶名和密碼,默認用戶名和密碼一致 import shelve userlist=[] user_data=shelve.open("user_data") # for i in user_data.items(): # print(i) print("當前已有的所有用戶的用戶名如下:") for i in user_data.keys():userlist.append(user_data[i]) print(userlist) while True:username=input("請輸入用戶名\n")if username in userlist:print("用戶名重復啦,請重新輸入用戶名!")continueelse:password=input("請輸入用戶密碼\n")break user_data[username]=password user_data.close() print("用戶創建成功~!")socket_server.py
#!/usr/bin/env python #-*-coding:utf-8-*- #Author:lzd #服務器端 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)) #綁定要監聽端口 server.listen() #監聽 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("我要開始等電話了") while True:Flag = Trueconn, addr = server.accept() # 等電話打進來# conn就是客戶端連過來而在服務器端為其生成的一個連接實例print(conn, addr)print("電話來了")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("請輸入用戶密碼".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("用戶名密碼驗證成功".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("當前目錄下為空".encode("utf-8"))elif data=="choose1".encode("utf-8"):conn.send("服務端準備接收文件".encode())data = conn.recv(1024).decode("utf-8") #收到文件大小,單位bytefilesize=dataprint("recv:文件大小為", data)tmpdata="服務端準備接收大小為"+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("文件發送完畢".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("當前目錄下為空".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("用戶名密碼驗證失敗".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類型,同時生成socket連接對象 client.connect(('localhost',6969)) while True:username=input("請輸入用戶名\n")if len(username) == 0: continueclient.send(username.encode("utf-8"))data=client.recv(1024)print(data.decode())if data.decode()=="請輸入用戶密碼":password=input("")client.send(password.encode("utf-8"))data=client.recv(1024)print(data.decode())if data.decode()=="用戶名密碼驗證失敗":continueelif data.decode()=="用戶名密碼驗證成功":while True:print("%s當前的工作目錄為/%s"%(username,username))print("""1、上傳文件;2、下載文件;3、查看當前目錄下的所有文件;4、退出程序請輸入你想操作的數字? """)choose=input("")if choose=="1":print("當前用戶的工作目錄下所有文件如下:")print(",".join(os.listdir(gongzuopath + r"/" + username)))fpath2=input("請輸入你想上傳到服務器的文件名,為便于測試,當前目錄下有個1M的文件ros.zip\n")print("默認會在當前用戶的目錄下生成一個當前時間的文件。")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")) #服務器準備接收文件client.send(fpath_size.encode("utf-8"))data = client.recv(1024)print(data.decode("utf-8")) #服務端準備接收大小為%s的文件 client.sendall(filedata)data = client.recv(1024)print(data.decode("utf-8")) # 文件發送完畢if choose=="2":client.send("choose2".encode("utf-8"))data = client.recv(1024)print("您當前的工作目錄下,所有的文件如下:")print(data.decode("utf-8")) # 顯示當前工作目錄下所有文件if data.decode("utf-8")=="當前目錄下為空":continueprint("您想下載哪個文件到本地?默認下載到當前腳本的工作目錄的download目錄")fpath2 = input("請輸入你想下載的文件名\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("您當前的工作目錄下,所有的文件如下:")print(data.decode("utf-8"))if choose=="4":client.send("choose4".encode("utf-8"))client.close()exit()?
總結
以上是生活随笔為你收集整理的第七周作业——简单FTP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最全Kafka 设计与原理详解【2017
- 下一篇: lpl英雄联盟职业联赛组成部分