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