import socket import struct from db import search_by_date import re import json import time 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) < 4: data = connection.recv(4 - len(buffer)) if not data: raise ConnectionError('Connection was closed') buffer += data size_packed, buffer = buffer[:4], buffer[4:] 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) HOST, PORT = ADDR = '0.0.0.0', 6000 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