import socket import struct import json import os import sys from datetime import datetime from tools.common import basedir from tools.t7 import AutoLayout as T7 from tools.novaplus import AutoLayout as NovaPlus def recvdata(conn, path): """ 接受文件 :param conn: :param path: :return: """ header_size = struct.unpack('i', conn.recv(4))[0] header_bytes = conn.recv(header_size) header_json = header_bytes.decode('utf-8') header_dic = json.loads(header_json) content_len = header_dic['contentlen'] content_name = header_dic['contentname'] select_type = header_dic['select_type'] recv_len = 0 fielpath = os.path.join(path, '%s_%s' % (datetime.now().strftime("%m%d%H%M"), content_name)) file = open(fielpath, 'wb') while recv_len < content_len: correntrecv = conn.recv(1024 * 1000) file.write(correntrecv) recv_len += len(correntrecv) file.close() return fielpath, select_type def senddata(conn, path, message=None): name = os.path.basename(os.path.realpath(path)) if not message: with open(path, 'rb') as file: content = file.read() headerdic = dict( contentlen=len(content), contentname=name ) headerjson = json.dumps(headerdic) headerbytes = headerjson.encode('utf-8') headersize = len(headerbytes) conn.send(struct.pack('i', headersize)) conn.send(headerbytes) conn.sendall(content) else: headerdic = dict( contentlen=len(path), contentname='message' ) headerjson = json.dumps(headerdic) headerbytes = headerjson.encode('utf-8') headersize = len(headerbytes) conn.send(struct.pack('i', headersize)) conn.send(headerbytes) conn.sendall(path.encode('utf-8')) def server(): myserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM) adrss = ("", 8191) myserver.bind(adrss) myserver.listen(5) while True: try: myclient, adddr = myserver.accept() recv_content, select_type = recvdata(myclient, os.path.join(basedir, 'example')) if select_type == 'nova': layout = NovaPlus(recv_content, data_limit=800) elif select_type == 'xplus': layout = NovaPlus(recv_content, data_limit=400) else: layout = T7(recv_content, data_limit=1520) outputpath = layout.run() senddata(myclient, outputpath) except Exception as e: print(e) continue if __name__ == '__main__': if len(sys.argv) > 1: select_type = sys.argv[1] if select_type == 'nova': layout = NovaPlus(sys.argv[2], data_limit=800) elif select_type == 'xplus': layout = NovaPlus(sys.argv[2], data_limit=400) else: layout = T7(sys.argv[2], data_limit=1520) outputpath = layout.run() else: server()