国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現的FTP通信客戶端與服務器端功能示例

2020-02-22 23:34:16
字體:
來源:轉載
供稿:網友

本文實例講述了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')            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 信阳市| 盐源县| 镇江市| 武邑县| 噶尔县| 察雅县| 岳普湖县| 宝山区| 丹凤县| 武宁县| 永寿县| 平陆县| 文成县| 田阳县| 遵义县| 大名县| 乐清市| 松溪县| 烟台市| 昌邑市| 兴城市| 博客| 班戈县| 雅安市| 五大连池市| 定日县| 东乌珠穆沁旗| 康定县| 巴里| 石棉县| 营口市| 丰都县| 剑川县| 宣化县| 黑河市| 辽源市| 宜川县| 三门县| 道孚县| 曲阳县| 吉安市|