日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python 基于selectors庫(kù)實(shí)現(xiàn)文件上傳與下載

瀏覽:52日期: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 = {} # 創(chuàng)建空字典 self.hasReceived = 0 self.hasSend=0 self.sel = selectors.DefaultSelector() # 生成一個(gè)select對(duì)象 self.create_socket() #create_socket()是創(chuàng)建socket對(duì)象函數(shù)完成綁定功能 self.hanle() #handle()函數(shù)完成循環(huán)監(jiān)聽(tīng) 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連接對(duì)象注冊(cè)到select連接列表中,并交給accept函數(shù)處理 print('服務(wù)端已打開(kāi),請(qǐng)連接客戶端') def hanle(self): while True: events = self.sel.select() # 默認(rèn)是阻塞,有活動(dòng)連接就返回活動(dòng)的連接列表 # 這里看起來(lái)是select,其實(shí)有可能會(huì)使用epoll,如果你的系統(tǒng)支持epoll,那么默認(rèn)就是epoll # print('event==',events) for key, mask in events:callback = key.data # 去調(diào)accept函數(shù)callback(key.fileobj, mask) # key.fileobj就是readable中的一個(gè)socket連接對(duì)象 def accept(self,sock, mask): conn, addr = sock.accept() # Should be ready print(’accepted’, conn, ’from’, addr) conn.setblocking(False) # 設(shè)定非阻塞 self.sel.register(conn, selectors.EVENT_READ, self.read) # 新連接注冊(cè)read回調(diào)函數(shù) self.dic[conn] = {} # 在空字典里進(jìn)行了conn賦值,self.dic={conn:{},} def read(self, conn, mask): # 接收了conn和mask try: # 加異常防止客戶端突然斷開(kāi) if not self.dic[conn]: # 判斷self.dic[conn]里面是否是空字典,如果是空字典,代表第一次進(jìn)來(lái)print(’====第一次進(jìn)來(lái)’)data = conn.recv(1024) # conn接收了客戶端發(fā)來(lái)的數(shù)據(jù)print('data==',str(data, encoding=’utf-8’))cmd, filename,filesize = str(data, encoding=’utf-8’).split(’|’) # 把接收到客戶端發(fā)來(lái)的包解開(kāi)拿到cmd,filename,filesize個(gè)信息self.dic = {conn: {'cmd': cmd, 'filename': filename, 'filesize': int(filesize)}} # 把拿到的cmd,filename,filesize信息放到self.dic字典里去后程序返回到handle()函數(shù)里的events繼續(xù)監(jiān)聽(tīng)print(self.dic)if cmd == ’put’: # 如果接收的信息是put conn.send(bytes('OK', encoding=’utf8’)) # 給客戶端返回一條數(shù)據(jù)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: # 如果不是空字典代表不是第一次進(jìn)來(lái)print(’不是第一次來(lái)的’)print(self.dic)if self.dic[conn].get(’cmd’, None): # 對(duì)接收的命令進(jìn)行分發(fā)判斷是put還是get cmd = self.dic[conn].get(’cmd’) if hasattr(self, cmd): # 如果cmd=put調(diào)用put函數(shù),如果是cmd=get函數(shù)調(diào)用get函數(shù) func = getattr(self, cmd) func(conn) else: print('error cmd!') conn.close()else: print('error cmd!') conn.close() except Exception as e: print(’斷開(kāi)的客戶端信息是:’, conn) self.sel.unregister(conn) # 如果沒(méi)有接收到數(shù)據(jù)做一個(gè)關(guān)閉解除 conn.close() # put上傳函數(shù) 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) # 接收客戶端上傳的數(shù)據(jù)1024字節(jié) self.hasReceived += len(recv_data) # 把接收的數(shù)據(jù)累加到變量self.hasReceived with open(path, ’ab’) as f: # 打開(kāi)文件 f.write(recv_data) # 把接收的數(shù)據(jù)寫(xiě)到文件里去 if fileSize == self.hasReceived: # 判斷文件大小跟接收大小是否一樣 if conn in self.dic.keys(): # 如果文件大小跟接收大小一樣清空字典self.dic[conn] = {} self.hasReceived = 0 #S上傳結(jié)束之后,需要將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接收了客戶端發(fā)來(lái)的數(shù)據(jù) dataOK = str(data, encoding=’utf-8’) if dataOK == ’OK’: with open(file, ’rb’) as f: # 打開(kāi)文件while fileSize > self.hasSend: # 循環(huán)的發(fā)送文件給客戶端 contant = f.read(1024) recv_size = len(contant) conn.send(contant) self.hasSend += recv_size s = str(int(self.hasSend / fileSize * 100)) + '%' print('正在下載文件: ' + fileName + ' 已經(jīng)下載:' + 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在命令行輸入的參數(shù),第一個(gè)參數(shù)默認(rèn)文件名,第二個(gè)參數(shù)跟IP地址和端口 if len(self.args)>1: #如果大于1把第二個(gè)參數(shù)倆個(gè)值賦值給port self.port=(self.args[1],int(self.args[2])) else: self.port=('127.0.0.1',8899)#如果沒(méi)有第二個(gè)參數(shù)默認(rèn)取這個(gè) self.create_socket() # self.command_fanout() #進(jìn)行命令分發(fā) self.mainPath = os.path.join(BASE_DIR, ’filename’) # 獲取該客戶端下的filename路徑 #create_socket函數(shù)創(chuàng)建socket對(duì)象連接服務(wù)端 def create_socket(self): try: self.sk = socket.socket() self.sk.connect(self.port) print(’連接FTP服務(wù)器成功!’) except Exception as e: print('eroor:',e) #command_fanout()函數(shù)進(jìn)行命令分發(fā) def command_fanout(self): while True: try:print('----------------welcome to ftp client-------------------')self.help_info()cmd_info = input(’>>>請(qǐng)輸入操作命令:’).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('是否繼續(xù)進(jìn)入ftp clinet,請(qǐng)選擇Y/N:').strip() if Tag.upper() == ’Y’: continue else: breakelse: print(’No such command ,please try again’) except Exception as e: # server關(guān)閉了print(’%s’ % e)break def help_info(self): print (’’’ get + (文件名) 表示下載文件 put + (文件名) 表示上傳文件 quit 表示退出登錄 ’’’) #put()上傳函數(shù) 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’)) #調(diào)用send方法把fileInf發(fā)給服務(wù)端 recvStatus = self.sk.recv(1024) #接收服務(wù)端返回的OK內(nèi)容 print(’recvStatus’ , recvStatus) hasSend = 0 if str(recvStatus, encoding=’utf8’) == 'OK': #如果接收到服務(wù)端返回的OKwith open(file, ’rb’) as f:#打開(kāi)文件 while fileSize > hasSend : #循環(huán)的去上傳文件 contant = f.read(1024) recv_size = len(contant) self.sk.send(contant) hasSend += recv_size s=str(int(hasSend/fileSize*100))+'%' print('正在上傳文件: '+fileName+' 已經(jīng)上傳:' +s)print(’%s文件上傳完畢’ % (fileName,)) else: print(’要上傳的文件不存在’) #get()下載函數(shù) 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’)) # 調(diào)用send方法把fileInfo發(fā)給服務(wù)端 recvdata = self.sk.recv(1024) # 接收服務(wù)端返回的是否存在文件內(nèi)容 recvStatus, fileSize = str(recvdata, encoding=’utf-8’).split(’|’) print('recvStatus==',recvStatus,fileSize) fileSize = int(fileSize) hasReceived = 0 if recvStatus == 'YES': # 如果接收到服務(wù)端返回的YES self.sk.send(bytes(’OK’, encoding=’utf8’)) # 通知服務(wù)端可以正常下載了 while fileSize > hasReceived: # 循環(huán)的發(fā)送文件給客戶端recv_data = self.sk.recv(1024) # 接收客戶端上傳的數(shù)據(jù)1024字節(jié)hasReceived += len(recv_data) # 把接收的數(shù)據(jù)累加到變量self.hasReceivedprint('hasReceived',hasReceived)with open(path, ’ab’) as f: # 打開(kāi)文件 f.write(recv_data) # 把接收的數(shù)據(jù)寫(xiě)到文件里去if fileSize == hasReceived: # 判斷文件大小跟接收大小是否一樣 print('%s 下載完畢!' % fileName) recvStatus = ’YESS’ else: print(’要下載的文件不存在’)if __name__==’__main__’: selectFtpClient()

以上就是python 基于selectors庫(kù)實(shí)現(xiàn)文件上傳與下載的詳細(xì)內(nèi)容,更多關(guān)于python 上傳下載的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日韩高清一区二区三区在线 | 国产亚洲一区二区手机在线观看| 日韩三级一区| 国产精品美女| 亚洲最新av| 欧美日韩黄网站| 久久丁香四色| 久久男人av资源站| 久久激情一区| 免费在线观看一区二区三区| 中文一区一区三区免费在线观| 中文字幕av一区二区三区四区| 青青草国产成人99久久| 免费日韩一区二区三区| 精品三级在线观看视频| 日韩激情综合| 在线免费观看亚洲| 国产精品最新自拍| 日韩精品欧美精品| 国产主播一区| 一级成人国产| 国产精品自在| 欧美韩日一区| 伊人久久亚洲影院| 亚洲日本三级| 国产日韩欧美中文在线| 精品91福利视频| 狠狠色狠狠色综合日日tαg| 亚州av乱码久久精品蜜桃| 一区二区电影| 中文字幕在线免费观看视频| 亚洲福利精品| 亚洲精品123区| 日本精品黄色| 欧美日韩 国产精品| 国产一区二区中文| 日韩欧美不卡| 久久av免费看| 亚洲精品看片| 亚洲深爱激情| 91一区二区三区四区| 久久亚州av| 国产欧美一区二区三区精品酒店 | 久久精品亚洲人成影院| 久久女人天堂| 美女尤物国产一区| 国产精品久久亚洲不卡| 亚洲伊人精品酒店| 在线一区欧美| 波多野结衣一区| 久久国产小视频| 色婷婷狠狠五月综合天色拍| 精品日韩一区| yellow在线观看网址| 久久免费视频66| 久久中文字幕一区二区三区| 97人人精品| 免费看av不卡| 国产一区二区色噜噜| 麻豆精品新av中文字幕| 国产麻豆一区二区三区精品视频| 亚洲欧洲免费| 国产精品片aa在线观看 | 国产成人免费视频网站视频社区| 国产麻豆精品| 国产一区二区精品久| 日韩电影免费网站| 欧美精品羞羞答答| 免费在线观看一区二区三区| 久久精品999| 国产日韩欧美一区在线| 日韩欧美另类一区二区| 红桃视频欧美| 精品中文字幕一区二区三区| 欧美中文高清| 欧美亚洲色图校园春色| 国产精品男女| 黄色在线网站噜噜噜| 色88888久久久久久影院| 91精品综合| 日av在线不卡| 国产精品亚洲产品| 色88888久久久久久影院| 亚洲少妇自拍| 91精品尤物| 激情久久一区二区| 亚洲性视频h| 欧美一区91| 涩涩av在线| 最新国产精品久久久| 精品午夜视频| 久久av在线| 久久精品99国产精品日本| 日韩大片在线播放| 美女精品在线观看| 理论片午夜视频在线观看| 中文字幕亚洲精品乱码| 福利在线一区| 亚洲日本国产| 久久国产直播| 日韩精品国产欧美| 日韩精品91| 久久97视频| 中文字幕亚洲精品乱码| 日韩精品一区二区三区免费观看| 日本精品在线播放| 妖精视频成人观看www| 四虎成人av| 日本电影久久久| 亚洲视频综合| 国产精品99在线观看| 国产精品宾馆| 天堂av一区| 久久不射中文字幕| 久久精品国产大片免费观看| 国产精品免费大片| 日韩在线一区二区| 欧美女激情福利| 久久精品国产大片免费观看| 麻豆精品视频在线| 欧美一区二区三区久久精品| 羞羞答答国产精品www一本| 五月精品视频| av亚洲免费| 日韩视频久久| 久久xxxx精品视频| 亚洲免费一区二区| 久久性天堂网| 日韩激情中文字幕| 日韩av在线免费观看不卡| 石原莉奈在线亚洲二区| 国产精品日韩| 亚洲1区在线观看| 青青草伊人久久| 国产精品hd| 韩日一区二区| 久久久久99| 中文在线一区| 日本亚洲最大的色成网站www | 亚洲国产专区| 免费日韩精品中文字幕视频在线| 蜜桃视频在线观看一区| 婷婷亚洲成人| 国产精品嫩草影院在线看| 久久只有精品| 亚洲午夜电影| 日本不卡高清| 国产精品久久观看| 久久中文字幕av一区二区不卡| 亚洲激情精品| 国产日韩视频在线| 精品捆绑调教一区二区三区| 日韩视频一区| 欧美一级网站| 亚洲一级少妇| 亚洲一区av| 电影91久久久| 久久福利影视| 国产一区二区三区视频在线| 亚洲免费激情| 日本精品黄色| 亚洲精品激情| 欧美成人基地 | 成人午夜在线| 首页国产欧美久久| 欧美视频二区| 亚洲一级二级| 久久精品人人| 石原莉奈一区二区三区在线观看| 国产精品二区不卡| 亚洲精品亚洲人成在线观看| 天堂网av成人| 精品久久精品| 日韩av电影一区| 久久99伊人| 成人羞羞在线观看网站| 国产一精品一av一免费爽爽| 午夜在线精品| 欧洲av不卡| 精品伊人久久久| 亚洲深深色噜噜狠狠爱网站 | 欧洲毛片在线视频免费观看| 激情中国色综合| 国产精品亚洲综合在线观看| 免费看欧美美女黄的网站| 激情综合网址| 亚洲成人二区| 欧美成人精品三级网站| 美女久久99| 国产精品2023| 国产精品一区二区三区www | 综合亚洲色图| 中文字幕日韩高清在线| 午夜久久一区| 欧美日韩国产高清| 日韩午夜电影| 中文一区一区三区免费在线观| 香蕉久久久久久久av网站| 在线亚洲一区| 视频精品一区|