怎么在python中使用选择器库实现一个文件上传功能

  介绍

这篇文章给大家介绍怎么在python中使用选择器库实现一个文件上传功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

服务器。py

import 选择器   import 套接字   import 操作系统   import 时间         BASE_DIR =os.path.abspath (os.path.dirname (__file__))      class  selectFtpserver:   def 才能__init__(自我):   ,,,self.dic =,{}, #,创建空字典   ,,,self.hasReceived =0   ,,,self.hasSend=0   ,,,self.sel =, selectors.DefaultSelector(), #,生成一个选择对象   ,,,self.create_socket (), # create_socket()是创建插座对象函数完成绑定功能   ,,,self.hanle(), #处理()函数完成循环监听      def 才能create_socket(自我):   ,,,sock =, socket.socket ()   ,,,sock.bind ((& # 39; 127.0.0.1 # 39;,, 8899))   ,,,sock.listen ()   ,,,sock.setblocking(假)   ,,,self.sel.register (selectors.EVENT_READ,袜子,还以为;self.accept), #,把刚生成的袜子连接对象注册到选择连接列表中,并交给接受函数处理   ,,,print(“服务端已打开,请连接客户端“)      def 才能hanle(自我):   ,,,while 正确的:   ,,,,,events =, self.sel.select(), #,默认是阻塞,有活动连接就返回活动的连接列表   ,,,,,#,这里看起来是选择,其实有可能会使用epoll,如果你的系统支持epoll,那么默认就是epoll   ,,,,,#,打印(“==笆录?事件)   ,,,,,for 关键,,mask 拷贝事件:   ,,,,,,,callback =, key.data  #,去调接受函数   ,,,,,,,回调(key.fileobj,面具),#,key.fileobj就是可读中的一个套接字连接对象      def 才能接受(自我、袜子,面具):   康涅狄格州,,,,,addr =, sock.accept (), #, Should  be 准备好了   ,,,print(& # 39;接受# 39;,,康涅狄格州,,& # 39;从# 39;,,addr)   ,,,conn.setblocking (False), #,设定非阻塞   ,,,self.sel.register(康涅狄格州,selectors.EVENT_READ,, self.read), #,新连接注册读回调函数   ,,,self.dic(康涅狄格州),=,{},#,在空字典里进行了康涅狄格州赋值,self.dic={康涅狄格州:{}}      def 才能读取(自我,,康涅狄格州,,面具):,#,接收了康涅狄格州和面具   ,,,试一试:,#,加异常防止客户端突然断开   ,,,,,if  not  self.dic(康涅狄格州):,#,判断self.dic(康涅狄格州)里面是否是空字典,如果是空字典,代表第一次进的来   ,,,,,,,印刷(& # 39;====第一次进来& # 39;)   ,,,,,,,data =, conn.recv(1024), #,康涅狄格州接收了客户端发来的数据   ,,,,,,,print (“data=https://www.yisu.com/zixun/=? str(数据、编码=皍tf - 8”))   cmd,文件名,文件大?str(数据、编码=皍tf - 8”) .split(“|”) #把接收到客户端发来的包解开拿到cmd,文件名,文件大小个信息   自我。dic={康涅狄格州:{“cmd”: cmd,“文件名”:文件名,“文件大小”:int(文件大小)}}#把拿到的cmd,文件名,文件大小信息放到self.dic字典里去后程序返回到处理()函数里的事件继续监听   打印(self.dic)   如果cmd==鞍选?#如果接收的信息是   conn.send(字节(“OK”,编码=' use utf8 ')) #给客户端返回一条数据   如果自我。迪拜国际资本(康涅狄格州)(cmd的)==暗玫健?   文件=os.path。加入(BASE_DIR“上传”,文件名)      如果os.path.exists(文件):   打印(“文件存在的情况,返回是的给客户端”)   文件大?os.path.getsize(文件)   自我。迪拜国际资本(康涅狄格州)(“文件大小”)=文件大小   打印(self.dic self.dic)   send_info=%年代| % s %(“是的”,文件大小)   conn.send(字节(send_info、编码=' use utf8 '))   其他:   打印(“文件不存在情况下”)   send_info=%年代| % s %(“不”,0)   conn.send(字节(send_info、编码=' use utf8 '))   自我。迪拜国际资本(康涅狄格州)={}#文件不存在的情况下,要将清空字典   其他:#如果不是空字典代表不是第一次进的来   打印('不是第一次来的”)   打印(self.dic)   如果self.dic(康涅狄格州)。get (cmd, None): #对接收的命令进行分发判断是把还是得到的   cmd=self.dic(康涅狄格州). get (cmd)   如果hasattr(自我,cmd): #如果cmd=把调用把函数,如果是cmd=得到函数调用得到函数   func=getattr(自我,cmd)   func(康涅狄格州)   其他:   print (cmd错误!)   conn.close ()   其他:   print (cmd错误!)   conn.close ()   除了例外e:   打印(“断开的客户端信息是:‘,康涅狄格州)   self.sel.unregister(康涅狄格州)#如果没有接收到数据做一个关闭解除   conn.close ()      #把上传函数   康涅狄格州def put(自我):   文件名=self.dic(康涅狄格州)(“文件名”)   文件大?self.dic(康涅狄格州)(“文件大小”)   #打印(“BASE_DIR BASE_DIR)=os.path路径。加入(BASE_DIR“上传”,文件名)#拿到要接收的信息   #打印(文件名、文件大小、路径)      recv_data=conn.recv(1024) #接收客户端上传的数据1024字节   自我。hasReceived len (recv_data) +=#把接收的数据累加到变量self.hasReceived      张开(路径,“ab”) f: #打开文件   f.write (recv_data) #把接收的数据写到文件里去      如果文件大?=自我。hasReceived: #判断文件大小跟接收大小是否一样   如果在self.dic.keys康涅狄格州():#如果文件大小跟接收大小一样清空字典   自我。迪拜国际资本(康涅狄格州)={}   自我。hasReceived=0 #年代上传结束之后,需要将自我。hasReceived重置成功   打印(“% s上传完毕!”%文件名)      康涅狄格州def get(自我):   文件名=self.dic(康涅狄格州)(“文件名”)   文件=os.path。加入(BASE_DIR“上传”,文件名)   #文件大?os.path.getsize(文件)   文件大?self.dic(康涅狄格州)(“文件大小”)      data=conn.recv(1024) #康涅狄格州接收了客户端发来的数据   dataOK=str(数据、编码=皍tf - 8”)      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在python中使用选择器库实现一个文件上传功能