layout/server.py

90 lines
2.7 KiB
Python

import socket
import struct
import json
import os
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__':
server()