day47——使用 Socket 实现 FTP Server
使用 Socket 实现 FTP Server ,实现如下功能:
get /tmp/1.txt /tmp/1.txt :把服务端 /tmp/1.txt 下载到客户端 /tmp/1.txt
put /tmp/1.txt /tmp/1.txt :把客户端 /tmp/1.txt 上传到服务端 /tmp/1.txt
1 [root@localhost ~]# cat ftp_server.py 2 #!/usr/bin/env python 3 #-*- coding: utf8 -*- 4 5 import socket 6 from subprocess import Popen, PIPE 7 8 HOST = '' 9 PORT = 1234 10 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 11 s.bind((HOST, PORT)) 12 s.listen(1) 13 conn, addr = s.accept() 14 print 'conn', conn 15 print 'Connected by', addr 16 while 1: 17 cmd = conn.recv(1024) 18 cmd_list = cmd.split() 19 if cmd_list[0] == 'get': 20 with open(cmd_list[1]) as fd: 21 while True: 22 data = fd.read(1024) 23 conn.sendall(data) 24 if not data: 25 conn.sendall('EOF') 26 break 27 if not cmd: break 28 conn.close()
1 [root@localhost ~]# cat ftp_client.py 2 #!/usr/bin/env python 3 #-*- coding:utf-8 -*- 4 5 import os 6 import sys 7 import tab 8 import socket 9 10 HOST = '192.168.5.131' 11 PORT = 1234 12 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13 s.connect((HOST, PORT)) 14 while True: 15 cmd = raw_input("Please input cmd: ").strip() 16 if cmd.lower()== 'exit' or cmd.lower() == 'quit': 17 break 18 cmd_list = cmd.split() 19 if len(cmd_list) != 3: 20 print "Ex: get file1 file2" 21 continue 22 else: 23 s.sendall(cmd) 24 if not os.path.exists(cmd_list[2]): 25 dst_file = cmd_list[2] 26 else: 27 dst_file = cmd_list[2]+'.new' 28 n = 1 29 while True: 30 data_rev = s.recv(1024) 31 if data_rev.endswith('EOF'): 32 data = data_rev[:-3] 33 else: 34 data = data_rev 35 if n == 1: 36 with open(dst_file, 'wb') as fd: 37 fd.write(data) 38 else: 39 with open(dst_file, 'a') as fd: 40 fd.write(data) 41 n += 1 42 if data_rev[-3:] == 'EOF': 43 print "Success! destination file is %s" % dst_file 44 break 45 s.close()