客户端
#!/usr/bin/python # -*- coding: utf-8 -*- import os __author__ = 'gaogd' import socket class FTP(object): def __init__(self,host,port): self.host = host self.port = port def put(self,msg): ###上传文件到服务端 print 'going to send file:%s to client' % msg[0] filename = msg[0] if os.path.isfile(filename): file_size = os.path.getsize(filename) ack_msg = "file_transter|put|%s" % (filename) print "ack_msg >>>>>>",ack_msg self.sock.send(ack_msg) client_file = self.sock.recv(1024) if client_file.startswith("file_transfer|put|recv|%s" %filename): ack_msg_size = "file_transfer|put|recv|%s|%s" %(filename,file_size) self.sock.send(ack_msg_size) print "ack_msg_size>>>",ack_msg_size else: print 'server not ready recv' return False # print '---->client_acl: ', client_ack client_ack = self.sock.recv(1024) if client_ack.startswith("file_transfer|put|recv|ready"): ## 如果服务器通过这个,那就是说明服务端已经做好接收的准备了 f = file(filename, 'rb') for line in f: self.sock.send(line) ##发文件 else: print '--file %s send done' % filename f.close() else: ack_msg = "file_transfer|get|file doesn't exist" self.sock.send(ack_msg) def get(self,msg): ##从服务端中下载内容 print 'get:: ',msg if len(msg) > 0: ##判断 get 后面是否接文件名 remote_filename = msg[0] cmd_msg="file_transter|get|%s" % remote_filename self.sock.send(cmd_msg) #print cmd_msg feedback = self.sock.recv(1024) print '---feedback',feedback if feedback.startswith("file_transter1|get|ready"): file_size = int(feedback.split('|')[-1]) ack_msg = "file_transfer|get|recv|ready" self.sock.send(ack_msg) f = file('recv/%s' % remote_filename,'wb') recv_size = 0 while not file_size == recv_size: if file_size - recv_size > 1024: data = self.sock.recv(1024) f.write(data) recv_size +=len(data) else: data = self.sock.recv(file_size - recv_size) recv_size += file_size - recv_size f.write(data) #print '--->',file_size,recv_size else: f.close() print feedback else: print 'test' def list_file(self): pass def interactive(self): while True: user_input = raw_input('ftp_client::').strip() if len(user_input) == 0: continue cmd = user_input.split() if hasattr(self,cmd[0]): func = getattr(self,cmd[0]) ## put |get |list_file func(cmd[1:]) else: print "\033[31;1m Wrong cmd usage !\033[0m" def connect(self): self.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.sock.connect((self.host,self.port )) self.interactive() if __name__ == '__main__': ftp = FTP('127.0.0.1',50018) ftp.connect()
服务端
#!/usr/bin/python # -*- coding: utf-8 -*- __author__ = 'gaogd' import os import SocketServer class MyTCPHandler(SocketServer.BaseRequestHandler): """ The RequestHandler class for our server. It is instantiated once per connection to the server, and must override the handle() method to implement communication to the client. """ def handle(self): while True: data = self.request.recv(1024).strip() data = data.split("|") print data if hasattr(self,data[0]): func = getattr(self,data[0]) func(data[1:]) def file_transter(self,msg): # print msg[0] if msg[0] == 'get': print 'going to send file:%s to client' % msg[1] filename = msg[1] if os.path.isfile(filename): file_size = os.path.getsize(filename) ack_msg = "file_transter1|get|ready|%s" % file_size self.request.send(ack_msg) client_ack = self.request.recv(1024) #print '---->client_acl: ', client_ack if client_ack.startswith("file_transfer|get|recv|ready"): f = file(filename,'rb') for line in f: self.request.send(line) else: print '--file %s send done'% filename f.close() else: ack_msg= "file_transfer|get|file doesn't exist" self.request.send(ack_msg) ############################################################################## if msg[0] == 'put': ##接收客户端上传过来的文件 print 'put:: ', msg[1] if len(msg[1]) > 0 : ###判断 get 后面是否接文件名,如果不存在,那就是命令有问题 remote_filename = msg[1] cmd_msg = "file_transfer|put|recv|%s" % remote_filename print 'cmd_msg>>>>',cmd_msg self.request.send(cmd_msg) ## 告诉客户端已经准备好接收了 feedback = self.request.recv(1024) print '---feedback', feedback if feedback.startswith("file_transfer|put|recv"): file_size = int(feedback.split('|')[-1]) ack_msg = "file_transfer|put|recv|ready" self.request.send(ack_msg) ## 告诉客户端已经做好准备接收了 f = file('recv/%s' % remote_filename, 'wb') recv_size = 0 while not file_size == recv_size: if file_size - recv_size > 1024: data = self.request.recv(1024) f.write(data) recv_size += len(data) else: data = self.request.recv(file_size - recv_size) recv_size += file_size - recv_size f.write(data) #print '--->',file_size,recv_size else: f.close() print feedback else: print 'put filename is not ' if __name__ == "__main__": #HOST, PORT = "localhost", 9999 HOST, PORT = "localhost", 50018 # Create the server, binding to localhost on port 9999 server = SocketServer.ThreadingTCPServer((HOST, PORT), MyTCPHandler) # Activate the server; this will keep running until you # interrupt the program with Ctrl-C server.serve_forever()