gtq7512
#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()

 

分类:

技术点:

相关文章: