python socketserver 实现FTP文件上传下载

  1. 创建一个请求处理的类,并且这个类要继承 BaseRequestHandlerclass ,并且还要重写父类里handle()方法;
  2. 你必须实例化 TCPServer,并且传递server IP和你上面创建的请求处理类,给这个TCPServer;
  3. server.handle_requese()#只处理一个请求,server.server_forever()处理多个一个请求,永远执行
  4. 关闭连接server_close()

ftp_server.py

import socketserver
import os
import json


'''
1. 创建一个请求处理的类,并且这个类要继承 BaseRequestHandlerclass ,并且还要重写父类里handle()方法;
2. 你必须实例化 TCPServer,并且传递server IP和你上面创建的请求处理类,给这个TCPServer;
3. server.handle_requese()#只处理一个请求,server.server_forever()处理多个一个请求,永远执行
4. 关闭连接server_close()
'''

class FtpHandler(socketserver.BaseRequestHandler):

    def cmd_put( self,*args ):
        msg_dict = args[0]
        filename = msg_dict['filename']
        filesize = msg_dict['filesize']
        if os.path.isfile(filename):
            f =open(filename+'.new','wb')
        else:
            f = open(filename,'wb')
        self.request.send(b'200 ok')
        receivesize = 0
        while receivesize < filesize:
            data = self.request.recv(1024)  #不能加strip()
            f.write(data)
            receivesize += len(data)
        else:
            print('file has uploaded')

    def cmd_get(self,*args):
        msg_dic = args[0]
        filename = msg_dic['filename']
        if os.path.isfile(filename):
            filesize = os.stat(filename).st_size
            f = open (filename,'rb')
        msg_dic = {
            'filesize':filesize
        }
        self.request.send(json.dumps(msg_dic).encode('utf-8'))
        data = self.request.recv(1024)
        for line in f:
            self.request.send(line)
        else:
            print(filename,'dowloaded success...')
            f.close()

    def handle(self):
        while True:
            self.data = self.request.recv(1024).strip()
            msg_dict = json.loads(self.data.decode('utf-8'))
            cmd = msg_dict['action']
            if hasattr(self,'cmd_%s'%cmd):
                func = getattr(self,'cmd_%s'%cmd)
                func(msg_dict)

if __name__ == '__main__':
    host,port = '0.0.0.0',9998
    server = socketserver.ThreadingTCPServer((host,port),FtpHandler)
    server.serve_forever()

ftp_client.py

import socket
import os
import json

class FtpClient(object):
    def __init__(self):
        self.client = socket.socket()

    def connect( self,ip,port ):
        self.client.connect((ip,port))

    def interactive( self ):
        while True:
            cmd = input('>>>').strip()
            if len(cmd)==0:continue
            cmd_str = cmd.split()[0]
            if hasattr(self,'cmd_%s'%cmd_str):
                func = getattr(self,'cmd_%s'%cmd_str)
                func(cmd)


    def cmd_put( self,*args ):
        cmd_split = args[0].split()
        if len(cmd_split) > 1:
            filename = cmd_split[1]
            if os.path.isfile(filename):
                filesize = os.stat(filename).st_size
                msg_dic = {
                    'action':'put',
                    'filename':filename,
                    'filesize':filesize
                }
                self.client.send(json.dumps(msg_dic).encode('utf-8'))
                server_response = self.client.recv(1024)
                f = open(filename,'rb')
                for line in f:
                    self.client.send(line)
                else:
                    print(filename,'upload success...')
                    f.close()
            else:
                print(filename,'is not exist')


    def cmd_get( self ,*args):
        cmd_split = args[0].split()
        if len(cmd_split) > 1:
            filename = cmd_split[1]
            msg_dic = {
                'action': 'get',
                'filename': filename
            }
            if os.path.isfile(filename):
                f = open(filename+'.get','wb')
            else:
                f = open(filename,'wb')
            self.client.send(json.dumps(msg_dic).encode('utf-8'))
            self.data = self.client.recv(1024)
            msg_dic = json.loads(self.data.decode('utf-8'))
            filesize = msg_dic['filesize']
            self.client.send(b'200 ok')
            receivesize = 0
            while receivesize < filesize:
                data = self.client.recv(1024)
                f.write(data)
                lenth = len(data)
                receivesize += lenth
            else:
                print(filename,'dowloaded sucess....')
                f.close()

ftp = FtpClient()
ftp.connect('0.0.0.0',9998)
ftp.interactive()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值