python
- 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服务端
来源: http://www.bubuko.com/infodetail-2332436.html