成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

python 基于selectors庫實現文件上傳與下載

瀏覽:2日期:2022-06-30 16:56:09
server.py

import selectorsimport socketimport osimport timeBASE_DIR =os.path.abspath(os.path.dirname(__file__))class selectFtpserver: def __init__(self): self.dic = {} # 創建空字典 self.hasReceived = 0 self.hasSend=0 self.sel = selectors.DefaultSelector() # 生成一個select對象 self.create_socket() #create_socket()是創建socket對象函數完成綁定功能 self.hanle() #handle()函數完成循環監聽 def create_socket(self): sock = socket.socket() sock.bind((’127.0.0.1’, 8899)) sock.listen() sock.setblocking(False) self.sel.register(sock, selectors.EVENT_READ, self.accept) # 把剛生成的sock連接對象注冊到select連接列表中,并交給accept函數處理 print('服務端已打開,請連接客戶端') def hanle(self): while True: events = self.sel.select() # 默認是阻塞,有活動連接就返回活動的連接列表 # 這里看起來是select,其實有可能會使用epoll,如果你的系統支持epoll,那么默認就是epoll # print('event==',events) for key, mask in events:callback = key.data # 去調accept函數callback(key.fileobj, mask) # key.fileobj就是readable中的一個socket連接對象 def accept(self,sock, mask): conn, addr = sock.accept() # Should be ready print(’accepted’, conn, ’from’, addr) conn.setblocking(False) # 設定非阻塞 self.sel.register(conn, selectors.EVENT_READ, self.read) # 新連接注冊read回調函數 self.dic[conn] = {} # 在空字典里進行了conn賦值,self.dic={conn:{},} def read(self, conn, mask): # 接收了conn和mask try: # 加異常防止客戶端突然斷開 if not self.dic[conn]: # 判斷self.dic[conn]里面是否是空字典,如果是空字典,代表第一次進來print(’====第一次進來’)data = conn.recv(1024) # conn接收了客戶端發來的數據print('data==',str(data, encoding=’utf-8’))cmd, filename,filesize = str(data, encoding=’utf-8’).split(’|’) # 把接收到客戶端發來的包解開拿到cmd,filename,filesize個信息self.dic = {conn: {'cmd': cmd, 'filename': filename, 'filesize': int(filesize)}} # 把拿到的cmd,filename,filesize信息放到self.dic字典里去后程序返回到handle()函數里的events繼續監聽print(self.dic)if cmd == ’put’: # 如果接收的信息是put conn.send(bytes('OK', encoding=’utf8’)) # 給客戶端返回一條數據if self.dic[conn][’cmd’] == ’get’: file = os.path.join(BASE_DIR, 'upload', filename) if os.path.exists(file): print('文件存在的情況,返回YES給客戶端') filesize = os.path.getsize(file) self.dic[conn][’filesize’] = filesize print('self.dic',self.dic) send_info = ’%s|%s’ % (’YES’, filesize) conn.send(bytes(send_info, encoding=’utf8’)) else: print('文件不存在情況下') send_info = ’%s|%s’ % (’NO’, 0) conn.send(bytes(send_info, encoding=’utf8’)) self.dic[conn] = {} #文件不存在的情況下,要將清空字典 else: # 如果不是空字典代表不是第一次進來print(’不是第一次來的’)print(self.dic)if self.dic[conn].get(’cmd’, None): # 對接收的命令進行分發判斷是put還是get cmd = self.dic[conn].get(’cmd’) if hasattr(self, cmd): # 如果cmd=put調用put函數,如果是cmd=get函數調用get函數 func = getattr(self, cmd) func(conn) else: print('error cmd!') conn.close()else: print('error cmd!') conn.close() except Exception as e: print(’斷開的客戶端信息是:’, conn) self.sel.unregister(conn) # 如果沒有接收到數據做一個關閉解除 conn.close() # put上傳函數 def put(self, conn): fileName = self.dic[conn][’filename’] fileSize = self.dic[conn][’filesize’] # print('BASE_DIR',BASE_DIR) path = os.path.join(BASE_DIR, 'upload', fileName) # 拿到要接收的信息 # print(fileName,fileSize,path) recv_data = conn.recv(1024) # 接收客戶端上傳的數據1024字節 self.hasReceived += len(recv_data) # 把接收的數據累加到變量self.hasReceived with open(path, ’ab’) as f: # 打開文件 f.write(recv_data) # 把接收的數據寫到文件里去 if fileSize == self.hasReceived: # 判斷文件大小跟接收大小是否一樣 if conn in self.dic.keys(): # 如果文件大小跟接收大小一樣清空字典self.dic[conn] = {} self.hasReceived = 0 #S上傳結束之后,需要將self.hasReceived 重置成功 print('%s 上傳完畢!' % fileName) def get(self,conn): fileName = self.dic[conn][’filename’] file = os.path.join(BASE_DIR, 'upload', fileName) # fileSize = os.path.getsize(file) fileSize=self.dic[conn][’filesize’] data = conn.recv(1024) # conn接收了客戶端發來的數據 dataOK = str(data, encoding=’utf-8’) if dataOK == ’OK’: with open(file, ’rb’) as f: # 打開文件while fileSize > self.hasSend: # 循環的發送文件給客戶端 contant = f.read(1024) recv_size = len(contant) conn.send(contant) self.hasSend += recv_size s = str(int(self.hasSend / fileSize * 100)) + '%' print('正在下載文件: ' + fileName + ' 已經下載:' + s) if fileSize == self.hasSend: # 判斷文件大小跟接收大小是否一樣if conn in self.dic.keys(): # 如果文件大小跟接收大小一樣清空字典 self.dic[conn] = {}print('%s 下載完畢!' % fileName)self.hasSend = 0if __name__ == ’__main__’: selectFtpserver()client.py

import socketimport os,sysBASE_DIR=os.path.dirname(os.path.abspath(__file__))class selectFtpClient: def __init__(self): self.args=sys.argv #sys.argv在命令行輸入的參數,第一個參數默認文件名,第二個參數跟IP地址和端口 if len(self.args)>1: #如果大于1把第二個參數倆個值賦值給port self.port=(self.args[1],int(self.args[2])) else: self.port=('127.0.0.1',8899)#如果沒有第二個參數默認取這個 self.create_socket() # self.command_fanout() #進行命令分發 self.mainPath = os.path.join(BASE_DIR, ’filename’) # 獲取該客戶端下的filename路徑 #create_socket函數創建socket對象連接服務端 def create_socket(self): try: self.sk = socket.socket() self.sk.connect(self.port) print(’連接FTP服務器成功!’) except Exception as e: print('eroor:',e) #command_fanout()函數進行命令分發 def command_fanout(self): while True: try:print('----------------welcome to ftp client-------------------')self.help_info()cmd_info = input(’>>>請輸入操作命令:’).strip() # put 12.png imagesif not cmd_info: continuecmd,file = cmd_info.split() ##按照空格分隔# print('命令是什么', cmds)if cmd == 'quit': breakif hasattr(self, cmd): func = getattr(self, cmd) func(cmd,file) Tag = input('是否繼續進入ftp clinet,請選擇Y/N:').strip() if Tag.upper() == ’Y’: continue else: breakelse: print(’No such command ,please try again’) except Exception as e: # server關閉了print(’%s’ % e)break def help_info(self): print (’’’ get + (文件名) 表示下載文件 put + (文件名) 表示上傳文件 quit 表示退出登錄 ’’’) #put()上傳函數 def put(self,cmd,file): if os.path.isfile(file): #判斷本地文件是否存在 fileName = os.path.basename(file)#取出文件的名字 fileSize = os.path.getsize(file) #取出文件的大小 fileInfo = ’%s|%s|%s’%(cmd,fileName,fileSize) #給文件名字大小打包成fileInf self.sk.send(bytes(fileInfo, encoding=’utf8’)) #調用send方法把fileInf發給服務端 recvStatus = self.sk.recv(1024) #接收服務端返回的OK內容 print(’recvStatus’ , recvStatus) hasSend = 0 if str(recvStatus, encoding=’utf8’) == 'OK': #如果接收到服務端返回的OKwith open(file, ’rb’) as f:#打開文件 while fileSize > hasSend : #循環的去上傳文件 contant = f.read(1024) recv_size = len(contant) self.sk.send(contant) hasSend += recv_size s=str(int(hasSend/fileSize*100))+'%' print('正在上傳文件: '+fileName+' 已經上傳:' +s)print(’%s文件上傳完畢’ % (fileName,)) else: print(’要上傳的文件不存在’) #get()下載函數 def get(self,cmd,fileName): path = os.path.join(BASE_DIR, 'download', fileName) # 拿到要接收的信息 fileSize=0 fileInfo = ’%s|%s|%s’ % (cmd, fileName, fileSize) # 給文件名字大小打包成fileInf print(fileInfo) self.sk.send(bytes(fileInfo, encoding=’utf8’)) # 調用send方法把fileInfo發給服務端 recvdata = self.sk.recv(1024) # 接收服務端返回的是否存在文件內容 recvStatus, fileSize = str(recvdata, encoding=’utf-8’).split(’|’) print('recvStatus==',recvStatus,fileSize) fileSize = int(fileSize) hasReceived = 0 if recvStatus == 'YES': # 如果接收到服務端返回的YES self.sk.send(bytes(’OK’, encoding=’utf8’)) # 通知服務端可以正常下載了 while fileSize > hasReceived: # 循環的發送文件給客戶端recv_data = self.sk.recv(1024) # 接收客戶端上傳的數據1024字節hasReceived += len(recv_data) # 把接收的數據累加到變量self.hasReceivedprint('hasReceived',hasReceived)with open(path, ’ab’) as f: # 打開文件 f.write(recv_data) # 把接收的數據寫到文件里去if fileSize == hasReceived: # 判斷文件大小跟接收大小是否一樣 print('%s 下載完畢!' % fileName) recvStatus = ’YESS’ else: print(’要下載的文件不存在’)if __name__==’__main__’: selectFtpClient()

以上就是python 基于selectors庫實現文件上傳與下載的詳細內容,更多關于python 上傳下載的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日本国产一区二区| 丁香婷婷深情五月亚洲| 国产精品1024| 欧美特级限制片免费在线观看| 亚洲综合久久久久| 精品不卡视频| 中文字幕不卡在线观看| 99久久精品国产导航| 日韩精品在线网站| 国产 欧美在线| 日韩亚洲欧美在线观看| 久草这里只有精品视频| 久久精选视频| 午夜不卡在线视频| 另类亚洲自拍| 图片区小说区区亚洲影院| 亚洲永久在线| 性感美女极品91精品| 久久综合导航| 蜜桃免费网站一区二区三区| 91国产免费观看| 久久国产精品无码网站| 欧美日韩在线播放三区| 黑人巨大精品欧美黑白配亚洲| 欧美人妖巨大在线| 国产成人一级电影| 精品国产91久久久久久久妲己 | 国产一区二区女| 欧美日本国产一区| 成人国产精品免费观看| 欧美精品一区二区三区蜜桃| 你懂的亚洲视频| 18欧美乱大交hd1984| 国产日韩欧美一区| 日韩vs国产vs欧美| 欧美日韩你懂得| 成人精品鲁一区一区二区| xfplay精品久久| 欧美日韩国产不卡在线看| 国产精品第一页第二页第三页| 永久域名在线精品| 亚洲综合色噜噜狠狠| 色婷婷av一区二区三区软件| 精品夜夜嗨av一区二区三区| 日韩精品一区国产麻豆| 你懂的网址国产 欧美| 亚洲麻豆国产自偷在线| 免费不卡亚洲欧美| 久久国产精品免费| 欧美精品一区在线观看| 精品成人在线| 日韩成人dvd| 日韩精品综合一本久道在线视频| 91老师国产黑色丝袜在线| 国产精品成人免费精品自在线观看 | 亚洲成a人片综合在线| 日本电影亚洲天堂一区| 国产成人无遮挡在线视频| 久久综合999| 亚洲理伦在线| 久久精品国产77777蜜臀| 欧美一二三在线| 欧美日韩免费| 香蕉影视欧美成人| 日韩欧美电影在线| 亚洲激情一区二区三区| 婷婷中文字幕综合| 日韩免费在线观看| 亚洲激情影院| 国产自产v一区二区三区c| 欧美激情一区不卡| 一本一道久久a久久精品| 成人av资源下载| 亚洲精品乱码久久久久久久久| 在线亚洲免费视频| 成人国产精品免费观看动漫| 中文字幕日本乱码精品影院| 欧美探花视频资源| 午夜精品一区二区三区四区| 亚洲va韩国va欧美va| 日韩欧美色综合网站| 亚洲天堂激情| 免费不卡在线视频| 国产偷国产偷精品高清尤物| 久久精品午夜| 91免费看视频| 午夜精品久久久久| 久久久久国色av免费看影院| 亚洲欧美日韩国产| 成人动漫视频在线| 亚洲自拍与偷拍| 日韩精品专区在线影院观看| 国产精品亚洲产品| 波多野结衣中文字幕一区| 亚洲成人自拍一区| 久久久精品免费网站| 美女国产一区| 91亚洲国产成人精品一区二区三| 午夜免费欧美电影| 国产调教视频一区| 欧美又粗又大又爽| 国产一区观看| 国产乱淫av一区二区三区| 亚洲特级片在线| 日韩一区二区三区av| 西西裸体人体做爰大胆久久久| 成人在线综合网站| 亚洲精品一二三| 精品少妇一区二区三区在线播放 | 欧美日韩一区中文字幕| 国产精品www.| 捆绑调教一区二区三区| 国产精品久久久久久久久免费丝袜 | 国语精品一区| 国产精品自产自拍| 亚洲成人动漫在线免费观看| 国产午夜精品久久久久久免费视| 欧美性生活影院| 99国产精品久久久久老师| 成人aa视频在线观看| 麻豆精品新av中文字幕| 一区二区三区中文在线| 久久久久国产精品麻豆| 欧美日韩久久久久久| 亚洲欧美激情诱惑| 欧美日韩岛国| 不卡在线观看av| 美女精品自拍一二三四| 亚洲乱码国产乱码精品精98午夜 | 成人一区二区三区中文字幕| 亚欧色一区w666天堂| 国产人妖乱国产精品人妖| 欧美丰满少妇xxxxx高潮对白| 国产精品一区二区三区四区五区| 91麻豆6部合集magnet| 国产在线精品免费| 天天爽夜夜爽夜夜爽精品视频| 国产精品久久久久久久久果冻传媒| 91精品国产高清一区二区三区| 色综合久久天天| 国产一区二区你懂的| 欧美日韩精品免费看 | 国内成+人亚洲+欧美+综合在线| 亚洲线精品一区二区三区| 国产精品久久久久久亚洲毛片| 欧美va亚洲va在线观看蝴蝶网| 欧美日韩一区二区三区在线| 欧美专区在线| 一区二区福利| 在线成人亚洲| 欧美连裤袜在线视频| www.日韩av| 国产mv日韩mv欧美| 久88久久88久久久| 日韩av网站免费在线| 亚洲成人av资源| 一区二区三区四区五区视频在线观看| 国产欧美中文在线| 久久久久久97三级| 精品裸体舞一区二区三区| 在线成人av影院| 欧美日韩激情一区二区三区| 在线一区二区视频| 色噜噜久久综合| 91久久精品一区二区二区| 久久久综合网| 色综合久久久久综合体桃花网| 亚洲免费影视| 免费在线国产精品| 久久久精彩视频| 久久精品官网| 久久精品盗摄| 色婷婷综合中文久久一本| 久久久久久九九九九| 久久精彩视频| 91久久精品一区二区| 欧美在线影院一区二区| 欧洲日韩一区二区三区| 91豆麻精品91久久久久久| 欧美这里有精品| 欧美久久婷婷综合色| 日韩一级大片在线| 久久综合久色欧美综合狠狠| 国产亚洲一区二区三区四区 | 欧美日韩高清一区二区| 欧美人体做爰大胆视频| 欧美精品乱码久久久久久| 4438x成人网最大色成网站| 日韩午夜精品电影| 精品国精品自拍自在线| 久久亚区不卡日本| 亚洲国产高清不卡| 亚洲欧美偷拍卡通变态| 一区二区三区四区五区视频在线观看| 亚洲一级不卡视频| 日韩电影一区二区三区| 久久精品国产一区二区三| 国产一区二区三区高清播放| 风流少妇一区二区| 女同一区二区|