简易FTP

  老男孩----上海校区

  简易FTP

客户端端

import  socket
import  struct
import json
import os
class MYTCPCLIENT:
    address_family = socket.AF_INET
    socket_type = socket.SOCK_STREAM
    allow_reuse_address = False
    max_packet_size = 8192
    coding ='utf-8'
    request_queue_size = 5
    def __init__(self,server_address,connect = True):
        self.server_address = server_address
        self.socket = socket.socket(self.address_family,self.socket_type)

        if connect:
            try:
                self.client_connect()
            except:
                self.client_close()
                raise
    def client_connect(self):
        self.socket.connect(self.server_address)

    def client_close(self):
        self.socket.close()

    def run(self):
        while True:
            choice = input(">>>>:").strip()
            if not choice:continue
            f = choice.split()
            cmd=f[0]
            if hasattr(self,cmd):
                func = getattr(self,cmd)
                func(f)

    def put(self,args):
        cmd = args[0]
        filename = args[1]
        if not os.path.isfile(filename):
            print('file:%s is not exists' %filename)
            return
        else:
            filesize = os.path.getsize(filename)

        head_dic = {'cmd':cmd,'filename':os.path.basename(filename),'filesize':filesize}
        head_json=json.dumps(head_dic)
        head_json_bytes = bytes(head_json,encoding=self.coding)
        head_struce = struct.pack('i',len(head_json_bytes))
        self.socket.send(head_struce)
        self.socket.send(head_json_bytes)
        send_size = 0
        with open(filename,'rb') as f:
            for line in f:
                self.socket.send(line)
                send_size+=len(line)
                print(send_size)
            else:
                print('下载成功')

client = MYTCPCLIENT(('127.0.0.1',8080))
client.run()

服务端

import  socketserver
import struct
import  json
import os


class FtpServer(socketserver.BaseRequestHandler):
    coding='utf-8'
    server_dir ='file_upload'
    max_packet_size = 1024
    BASE_DIR=os.path.dirname(os.path.abspath(__file__))
    def handle(self):
        print(self.request)
        while True:
            data = self.request.recv(4)
            data_len=struct.unpack('i',data)[0]
            head_json= self.request.recv(data_len).decode(self.coding)
            head_dic = json.loads(head_json)
            cmd = head_dic['cmd']
            if hasattr(self,cmd):      # 判断这个对象中有没有这个属性
                func=getattr(self,cmd) #获取对象属性值
                func(head_dic)
    def put(self,args):
        flie_path =  os.path.normpath(os.path.join(
            self.BASE_DIR,
            self.server_dir,
            args['filename']
        ))
        filesize=args['filesize']
        recv_size = 0
        print('------>',flie_path)
        with open(flie_path,'wb') as f:
            while recv_size <filesize:
                recv_data = self.request.recv(self.max_packet_size)
                f.write(recv_data)
                recv_size += len(recv_data)
                print('recvsize:%s filesize:%s' % (recv_size, filesize))
ftpserver = socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
ftpserver.serve_forever()

 

posted @ 2020-09-16 10:13  请别对我太好  阅读(330)  评论(0编辑  收藏  举报