zoukankan      html  css  js  c++  java
  • 简易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()
  • 相关阅读:
    5道趣味Python热身题【新手必学】
    操作系统特征
    二叉树的中序遍历
    英语一图画作文模板
    函数
    双阶乘与华里士公式
    因式分解
    【】连通图——详细解释
    【】this指针——c++中的特殊指针
    咱们程序员好用的云笔记
  • 原文地址:https://www.cnblogs.com/yjc53/p/13677592.html
Copyright © 2011-2022 走看看