本文實例講述了Python實現的FTP通信客戶端與服務器端功能。分享給大家供大家參考,具體如下:
一 代碼
1、服務端代碼
import socketimport threadingimport osimport struct#用戶賬號、密碼、主目錄#也可以把這些信息存放到數據庫中users = {'zhangsan':{'pwd':'zhangsan1234', 'home':r'c:/python 3.5'}, 'lisi':{'pwd':'lisi567', 'home':'c://'}}def server(conn,addr, home): print('新客戶端:'+str(addr)) #進入當前用戶主目錄 os.chdir(home) while True: data = conn.recv(100).decode().lower() #顯示客戶端輸入的每一條命令 print(data) #客戶端退出 if data in ('quit', 'q'): break #查看當前文件夾的文件列表 elif data in ('list', 'ls', 'dir'): files = str(os.listdir(os.getcwd())) files = files.encode() conn.send(struct.pack('I', len(files))) conn.send(files) #切換至上一級目錄 elif ''.join(data.split()) == 'cd..': cwd = os.getcwd() newCwd = cwd[:cwd.rindex('//')] #考慮根目錄的情況 if newCwd[-1] == ':': newCwd += '//' #限定用戶主目錄 if newCwd.lower().startswith(home): os.chdir(newCwd) conn.send(b'ok') else: conn.send(b'error') #查看當前目錄 elif data in ('cwd', 'cd'): conn.send(str(os.getcwd()).encode()) elif data.startswith('cd '): #指定最大分隔次數,考慮目標文件夾帶有空格的情況 #只允許使用相對路徑進行跳轉 data = data.split(maxsplit=1) if len(data) == 2 and os.path.isdir(data[1]) / and data[1]!=os.path.abspath(data[1]): os.chdir(data[1]) conn.send(b'ok') else: conn.send(b'error') #下載文件 elif data.startswith('get '): data = data.split(maxsplit=1) #檢查文件是否存在 if len(data) == 2 and os.path.isfile(data[1]): conn.send(b'ok') fp = open(data[1], 'rb') while True: content = fp.read(4096) #發送文件結束 if not content: conn.send(b'overxxxx') break #發送文件內容 conn.send(content) if conn.recv(10) == b'ok': continue fp.close() else: conn.send(b'no') #無效命令 else: pass conn.close() print(str(addr)+'關閉連接')#創建Socket,監聽本地端口,等待客戶端連接sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind(('', 10600))sock.listen(5)while True: conn, addr = sock.accept() #驗證客戶端輸入的用戶名和密碼是否正確 userId, userPwd = conn.recv(1024).decode().split(',') if userId in users and users[userId]['pwd'] == userPwd: conn.send(b'ok') #為每個客戶端連接創建并啟動一個線程,參數為連接、客戶端地址、客戶主目錄 home = users[userId]['home'] t = threading.Thread(target=server, args=(conn,addr,home)) t.daemon = True t.start() else: conn.send(b'error')
新聞熱點
疑難解答