import selectors import socket,os,sys BASE_DIR= os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) sel = selectors.DefaultSelector() cmdlist=['put','get'] class Ftp(object): def __init__(self): pass def accept(self,sock, mask): conn, addr = sock.accept() # Should be ready conn.setblocking(False) sel.register(conn, selectors.EVENT_READ, self.read) def read(self,conn, mask): # while True: cmd = conn.recv(1024).decode().split() # Should be ready if len(cmd) != 2 : conn.send(b'wrong command!') elif cmd[0] in cmdlist: # conn.send(b'ok') if hasattr(self,'cmd_%s'%cmd[0]): fc = getattr(self, "cmd_%s" % cmd[0]) fc(conn,cmd[-1]) else: print('closing', conn) sel.unregister(conn) conn.close() def cmd_put(self,conn,file): conn.setblocking(True) print("Put [%s] to client" % file) conn.send(b"put01") ## please send the file size filesize = int(conn.recv(1024).decode()) conn.send(b"put02") ## please send the file upload_file=os.path.join(BASE_DIR,'data',os.path.basename(file)) with open(upload_file, 'wb') as f: size = 0 while True: if (filesize - size) > 10240: recvsize = 10240 else: recvsize = filesize - size data = conn.recv(recvsize) size += len(data) if int(filesize) == size: f.write(data) f.flush() print("Upload [%s] done ....." % upload_file) conn.send(b'putok') break f.write(data) f.flush() def cmd_get(self,conn,file): conn.setblocking(True) if os.path.exists(file): file_size = str(os.path.getsize(file)).encode() conn.send(b'get01') ## ready to send file size rectag1 = conn.recv(1024).decode() if rectag1 == 'get01':conn.send(file_size) rectag2 = conn.recv(10240).decode() if rectag2 == 'get02': while True: with open(file, 'rb') as f: d = f.read() conn.sendall(d) rectag = conn.recv(1024).decode() if rectag == 'getok': print("Download [%s] done!" % file) break else: print("The [%s] not exists!" %file) conn.send(b'get00') def run(): start_ftp = Ftp() sock = socket.socket() sock.bind(('localhost', 9000)) sock.listen(100) sock.setblocking(False) sel.register(sock, selectors.EVENT_READ, start_ftp.accept) while True: events = sel.select() for key, mask in events: callback = key.data try: callback(key.fileobj,mask) except: sel.unregister(key.fileobj) key.fileobj.close()
python selectors ftp服务端
原创w411639146 ©著作权
©著作权归作者所有:来自51CTO博客作者w411639146的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:线程调用方式
下一篇:python rabbitmq
![](https://ucenter.51cto.com/images/noavatar_middle.gif)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
服务端测试实战
服务端测试开发技术详解
自动化测试 服务端测试 API测试 接口自动化测试 -
服务端测试之PostMan自动生成测试脚本
PostMan智能化测试实战
接口测试 自动化测试 服务端测试 PostMan -
ftp服务端搭建python ftp服务端搭建
上一篇呢,有ftpUtil工具类,这篇呢,主要是讲ftp服务在win7上的搭建,目前我用过的方法呢有两种,第一种是直接开启win7上的服务这样不需要下载,操作直观,第二种呢,是下载了一个叫:FileZillaServer的软件,软件不大就2M,用起来也非常简单!下面先说第一中方法:1.在win7上先开启ftp服务:这里点击确定后,可能会要等一会儿,完成后有时系统会提示重启2.打开 计
ftp服务端搭建python commons-net-3.0.jar FTP上传下载尾部数据丢失 FTP上传或者下载文件损坏 jar包