Python 使用Socket实现FTP功能

FtpServer

#!/usr/bin/env python

import SocketServer

class MyServer(SocketServer.BaseRequestHandler):
   def setup(self):
      pass
   def handle(self):
      path='/tmp'
      while True:
          print self.request,self.client_address,self.server
          data = self.request.recv(1024)
          print data,'test'
          data = data.split('|')
          if data[0] == 'put':
             if len(data) > 2:
                filename_from_cli,file_size = data[1],int(data[2])
                self.request.send("ReadyToRecvFileContent")
                f=file('%s/%s'%(path,filename_from_cli),'wb')
                recv_size = 0
                flag = True
                while flag:
                     if recv_size + 4096 > file_size:
                          recv_data = self.request.recv(file_size - recv_size)
                          flag = False
                     else:
                          recv_data = self.request.recv(4096)
                          recv_size += 4096
                     f.write(recv_data)
                f.close()
                print 'sent Done'
                self.request.close()
   def finish(self):
      pass
if __name__ =='__main__':
  server=SocketServer.ThreadingTCPServer(('127.0.0.1',8000),MyServer)
  server.serve_forever()

 

FTPClient

#!/usr/bin/env python
import socket
import os
import sys

ip_port=('127.0.0.1',8000)
sk=socket.socket()
sk.connect(ip_port)

while True:
 input = raw_input('path:')
 cmd,path=input.split()
 file_name=os.path.basename(path)
 file_size=os.stat(path).st_size
 print file_size
 sk.send(cmd+"|"+file_name+'|'+str(file_size))
 sent_size=0
 data =  sk.recv(4096)
 if data == 'ReadyToRecvFileContent':
  f=file(path,'rb')
  flag=True
  while flag:
   if sent_size + 4096 > file_size :
        data=f.read()
        flag=False
   else:
        data = f.read(4096)
        sent_size += 4096
   sk.send(data)
  f.close()
 else:
  print 'no'

 

 

上面代码对Python对Socket封装实现FTP功能加已利用可以做很多事情了。

posted @ 2016-04-23 23:20  FreeMan1  阅读(1683)  评论(0编辑  收藏  举报