import socket import struct from db import search_by_date import re import json import time HOST, PORT = ADDR = '0.0.0.0', 6000 DATATYPE_SIZE = 4 # int def pack_data(data): encoded = data.encode() return struct.pack('I', len(encoded)) + encoded def handle_request(data): match = re.match(r'(\d+):?(\d+)?:?(\d+)?-(.*)', data) if match: *date, msg = match.groups() t = time.time() found = search_by_date(*map(lambda i: int(i) if i is not None else i, date), msg) print(f'Search took {time.time() - t} seconds') return pack_data(json.dumps(found)) else: print('String not matched.') return pack_data(json.dumps([])) def get_data(connection): buffer = b'' # Считываем размер пакета while len(buffer) < DATATYPE_SIZE: data = connection.recv(DATATYPE_SIZE - len(buffer)) if not data: raise ConnectionError('Connection was closed') buffer += data size_packed, buffer = buffer[:DATATYPE_SIZE], buffer[DATATYPE_SIZE:] if not size_packed: raise ConnectionError('Connection was closed') (size,) = struct.unpack('I', size_packed) data = connection.recv(size - len(buffer)) return buffer + data def handle_connection(connection, address): while True: try: data = get_data(connection) except ConnectionResetError: print(f'Connection with {address[0]} was unexpectedly closed') break except ConnectionError: print(f'Connection with {address[0]} was ended') break except KeyboardInterrupt: raise KeyboardInterrupt() else: if not data: print(f'Connection with {address[0]} was ended') break response = handle_request(data.decode()) connection.sendall(response) def main(): sock = socket.socket() sock.bind(ADDR) sock.listen(5) while True: print('Listening for new connections...') try: connection, address = sock.accept() print(f'Got a connection from {address[0]}') handle_connection(connection, address) except KeyboardInterrupt: print('Stopping server...') sock.close() print('Server stopped') break if __name__ == '__main__': success = db.init('otrs_error.log') if not success: print('Не удалось инициализировать базу данных. Завершаем работу...') else: main()