国产探花免费观看_亚洲丰满少妇自慰呻吟_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')            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桐乡市| 五寨县| 桐城市| 威信县| 黑龙江省| 中西区| 伊川县| 耿马| 宝鸡市| 宁乡县| 汤原县| 八宿县| 拉萨市| 台湾省| 宝兴县| 灵台县| 水富县| 宁安市| 吐鲁番市| 三台县| 西华县| 新和县| 江山市| 澄迈县| 建平县| 武城县| 资中县| 新宁县| 内黄县| 郴州市| 佳木斯市| 义乌市| 礼泉县| 弋阳县| 伊金霍洛旗| 郎溪县| 冷水江市| 平罗县| 青海省| 太谷县| 蚌埠市|