def make_file(has_recv): log.info("[trans-info]服务器开始创建[%s]文件..." % str(fpath)) with open(tmp_path, 'wb') as f: f.seek(has_recv) # 定位到已经传到的位置 while has_recv < int(fsize): data = client_socket.recv(trans_per_size) if not data: break else: f.write(data) has_recv += len(data) has_recv = os.path.getsize(tmp_path) # 计算文件大小 if int(has_recv) == int(fsize): os.rename(tmp_path, fpath) log.info("[trans-info]服务器已生成[%s]文件,大小为%s,与原文件大小一致" % (str(fpath), str(fsize))) return_info(has=has_recv, finish="True") else: os.remove(tmp_path) log.info("【trans-warn】服务器已生成[%s]文件,大小为%s,与原文件大小不一致!%s" % (str(fpath), str(fsize))) return_info(has=has_recv, finish="")
def return_info(exist, fsize): info = {"exist": str(exist), "fsize": str(fsize)} log.info("[trans-info]发送到客户端%s的服务器相关文件数据:%s" % (str(request_ip), str(info))) socket_send_json(client_socket, info)
def return_info(has, finish): info = {"has": str(has), "finish": str(finish)} log.info("[trans-info]发送到客户端%s的服务器相关文件数据:%s" % (str(request_ip), str(info))) socket_send_json(client_socket, info)
def server_start(): #获取服务器本机ip local_ip = socket.gethostbyname(socket.gethostname()) log.info("[trans-info][%s]trans server start..." % str((local_ip, 7000))) # 建立tans服务socket serv_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serv_socket.bind(('', 7000)) serv_socket.listen(128) while True: try: # b 接受客户端的连接请求 client_socket, addr = serv_socket.accept() try: result = socket_recv_dict(client_socket) log.info( "<-------------------------:%s------------------------>" % str(addr)) log.info("[trans-info]接收到的请求数据:%s" % str(result)) order = result['order'] if order == "add": service = recv_file elif order == "del": service = del_file elif order == "down": service = down_file #开启线程 t = threading.Thread(target=service, args=(client_socket, result, addr, local_ip)) t.start() except Exception as e: log.info('【trans-warn】接收的数据格式有误![%s]' % str(e)) socket_send_json(client_socket, "") except Exception as e: log.info('【trans-warn】连接有误![%s][%s]' % (str(addr), str(e))) log.info('【trans-warn】重新建立trans服务...') server_start()
def recv_file(client_socket, data, request_ip, local_ip): #在服务器上生成所上传的文件 def make_file(has_recv): log.info("[trans-info]服务器开始创建[%s]文件..." % str(fpath)) with open(tmp_path, 'wb') as f: f.seek(has_recv) # 定位到已经传到的位置 while has_recv < int(fsize): data = client_socket.recv(trans_per_size) if not data: break else: f.write(data) has_recv += len(data) has_recv = os.path.getsize(tmp_path) # 计算文件大小 if int(has_recv) == int(fsize): os.rename(tmp_path, fpath) log.info("[trans-info]服务器已生成[%s]文件,大小为%s,与原文件大小一致" % (str(fpath), str(fsize))) return_info(has=has_recv, finish="True") else: os.remove(tmp_path) log.info("【trans-warn】服务器已生成[%s]文件,大小为%s,与原文件大小不一致!%s" % (str(fpath), str(fsize))) return_info(has=has_recv, finish="") def return_info(has, finish): info = {"has": str(has), "finish": str(finish)} log.info("[trans-info]发送到客户端%s的服务器相关文件数据:%s" % (str(request_ip), str(info))) socket_send_json(client_socket, info) try: fsize = data['fsize'] fpath = data['fpath'] tmp_path = "%s.tmp" % str(fpath) #已经完整存在 if os.path.exists(fpath): log.info("[trans-info][%s]文件已完整存在,下面验证大小是否一致..." % str(fpath)) has_recv = os.path.getsize(fpath) # 计算文件大小 if int(has_recv) == int(fsize): log.info("[trans-info][%s]文件与待上传文件大小一致:V" % str(fpath)) return_info(has=has_recv, finish="True") else: log.info("[trans-info][%s]文件与待上传文件大小不一致:X" % str(fpath)) os.remove(fpath) return_info(has=0, finish="") #""空字符串为False make_file(has_recv) #为temp临时文件,上传了一部分 elif os.path.exists(tmp_path): has_recv = os.path.getsize(tmp_path) # 计算文件大小 log.info("已上传比例:%s" % str(has_recv % trans_per_size)) log.info("[trans-info][%s]文件已存在临时上传文件,大小为%s" % (str(tmp_path), str(has_recv))) return_info(has=has_recv, finish="") make_file(has_recv) #第一次上传 else: log.info("[trans-info][%s]文件未上传过此文件.即将上传..." % str(fpath)) has_recv = 0 return_info(has=has_recv, finish="") make_file(has_recv) except Exception as e: log.info('【trans-warn】%s上传至服务器%s的文件发生错误![%s]' % (str(request_ip), str(fpath), str(e)))