python: 基于select的sokct ftp 客户端

#7512
import socket
import hashlib,time
import json
import sys,os
import random


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
from conf import setting
import signal


  # 切换工作目录
# def exit_handle(signum, frame):
#
#     savedict,addr = client.get_save()
#     print("dddd",savedict,addr)
#     if addr:
#         with open(addr + '\\%s'%savedict["user"], 'wb') as f:
#             f.write(json.dumps(savedict).encode())
#     print('''
#         *******************************
#                     暂   停
#         *******************************
#         ''')
#     exit()
#
# signal.signal(signal.SIGINT,exit_handle)
# signal.signal(signal.SIGTERM,exit_handle)




class selectFTPClient(object):
    '''
        FTP客户端
        '''
    SOCK_FAMALY = socket.AF_INET  # IP v4
    SOCK_TYPE = socket.SOCK_STREAM
    SOCK_ALLOW_CONN = 1024

    def __init__(self,ip = 'localhost' ,port = 9999):
        self.client = socket.socket(self.SOCK_FAMALY,self.SOCK_TYPE)
        try:
            self.client.connect((ip,port))
            self.msg_dict = {}
            print("登陆时间:[%s],主机地址:[%s]"%(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()),self.client.getpeername()))
            self.interrupt = False
            self.interaction()
        except ConnectionRefusedError as e:
            print('\033[31;1m 连接中断,中断原因 [%s] ,中断时间:[%s] \033[0m'
                  % (e, time.strftime('[%Y-%m-%d %H:%M:%S]', time.localtime())))
            self.client.close()

    def com_get(self,com):
        os.chdir(setting.CLIENT_HOME)
        self.client.send(self.datahead(com, 'send'))
        recv_data = self.client.recv(1024)
        recv_data = self.datahead(recv_data,'recv')
        if recv_data['error'] == 777:
            filesize = recv_data['size']
            file_recv = 0
            _md5 = hashlib.md5()
            file_obj = open('copy%d'%random.randint(1,10000),'wb')
            respond = self.datahead(self.com_handle('rspond_ok'),'send')
            self.client.send(respond)
            print(recv_data)
            while file_recv < filesize:
                if filesize - file_recv > 1024 :
                    size = 1024
                else:
                    size = filesize - file_recv
                data = self.client.recv(size)
                file_recv +=len(data)
                file_obj.write(data)
                file_obj.flush()
                _md5.update(data)
                percentage = float(file_recv / filesize) * 100
                print("%.2f"%percentage)
            else:
                file_obj.close()
                md5 = self.client.recv(size).decode()
                if md5 ==  _md5.hexdigest():
                    print('\033[32;1m 下载成功 ,时间:[%s] \033[0m'
                          % (time.strftime('[%Y-%m-%d %H:%M:%S]', time.localtime())))
                else:
                    print('\033[31;1m 文件传输过程中丢失数据! ,时间:[%s] \033[0m'
                          % (time.strftime('[%Y-%m-%d %H:%M:%S]', time.localtime())))
        else:
            print('\033[31;1m 文件不存在,请重新输入! \033[0m')
            self.interaction()



    def com_put(self,com):
        os.chdir(setting.CLIENT_HOME)
        if os.path.exists(com['filename']):
            if os.path.isfile(com['filename']):
                com['size'] = os.stat(com['filename']).st_size
                com['error'] = 777
        else:
            print('\033[31;1m 文件不存在,请重新输入! \033[0m')
            self.interaction()
        self.client.send(self.datahead(com,'send'))
        recv_data = self.client.recv(1024)
        print(recv_data)
        if recv_data == b'rspond_ok':
            file_obj=open(com['filename'],'rb')
            for line in file_obj:
                self.client.send(line)
                time.sleep(1)
                print(1)
            print("上传完毕")



        #
        # if recv_data == b'rspond_ok':
        #     # recv_data = self.datahead(recv_data, 'recv')
        #     send_data = {}
        #     com = com.strip().split()
        #     send_data['error'] = 222;
        #     send_data['action'] = com[0]
        #     if os.path.exists(com[1]):
        #         if os.path.isfile(com[1]):
        #             send_data['size'] = os.stat(com[1]).st_size
        #             send_data['error'] = 777;
        #             send_data['filename'] = com[1];
        #     print(send_data)
        #     _send ='upload'+' '+ json.dumps(send_data)
        #     self.client.send(_send.encode())


        # recv_data = self.client.recv(1024)
        # recv_data = self.datahead(recv_data, 'recv')

    def com_format(self,com_data):
        pass

    def interaction(self):
        while True:
                try:
                    com = input("%s>>:"%setting.CLIENT_HOME)
                    if len(com) == 0:
                        continue
                    com = self.com_handle(com)
                    antion = com['action']
                    print(com)
                    if antion is not None and hasattr(self, 'com_%s' % antion ):
                        func = getattr(self, 'com_%s' % antion)
                        func(com)
                    else:
                        continue
                except (ConnectionRefusedError,ConnectionResetError )as e:
                    print('\033[31;1m 连接中断,中断原因 [%s] ,中断时间:[%s] \033[0m'
                          % (e, time.strftime('[%Y-%m-%d %H:%M:%S]', time.localtime())))
                    self.client.close()


    def com_handle(self,com):
        com = com.strip().split()
        com_dict ={}
        if len(com) > 1 :
            com_dict['action'] =  com[0]
            com_dict['filename'] =com[1]
        else:
            com_dict['action'] = com[0]
            com_dict['filename'] = 'no'
        com_dict['size'] = 0
        com_dict['error'] = 222
        return com_dict


    def datahead(self,data,flag = 'else'):
        if flag == 'send':
            return json.dumps(data).encode()
        elif flag == 'recv':
            return json.loads(data.decode())
        else:
            return data.encode()


if __name__ == '__main__':
    client = selectFTPClient()

 

转载于:https://www.cnblogs.com/gtq7512/p/11396783.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值