From ce17eacde37c124abe07288ae1453b5b658f8ff2 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 17 Apr 2019 15:01:38 +0400 Subject: =?UTF-8?q?=D0=A7=D0=B5=D1=82=D0=B2=D0=B5=D1=80=D1=82=D1=8B=D0=B9?= =?UTF-8?q?=20=D0=B4=D0=B5=D0=BD=D1=8C,=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day4/task3/server.py | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 day4/task3/server.py (limited to 'day4/task3/server.py') diff --git a/day4/task3/server.py b/day4/task3/server.py new file mode 100644 index 0000000..b3cb619 --- /dev/null +++ b/day4/task3/server.py @@ -0,0 +1,82 @@ +import socket +import struct +from db import search_by_date +import re +import json + + +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() + return pack_data(json.dumps(search_by_date(*date, msg))) + + 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', 6001 +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 -- cgit v1.2.3 From 588cdffdc1f527fac5a7bdd934008882e3efc70d Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 17 Apr 2019 20:12:14 +0400 Subject: =?UTF-8?q?=D0=A3=D1=81=D0=BA=D0=BE=D1=80=D0=B5=D0=BD=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B8=D1=81=D0=BA=20=D0=BF=D0=BE=20=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day4/task3/server.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'day4/task3/server.py') diff --git a/day4/task3/server.py b/day4/task3/server.py index b3cb619..f4e5ebe 100644 --- a/day4/task3/server.py +++ b/day4/task3/server.py @@ -3,6 +3,7 @@ import struct from db import search_by_date import re import json +import time def pack_data(data): @@ -14,7 +15,11 @@ def handle_request(data): match = re.match(r'(\d+):?(\d+)?:?(\d+)?-(.*)', data) if match: *date, msg = match.groups() - return pack_data(json.dumps(search_by_date(*date, msg))) + + 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.') @@ -63,7 +68,7 @@ def handle_connection(connection, address): connection.sendall(response) -HOST, PORT = ADDR = '0.0.0.0', 6001 +HOST, PORT = ADDR = '0.0.0.0', 6000 sock = socket.socket() sock.bind(ADDR) sock.listen(5) -- cgit v1.2.3 From 4a3db50d7df0f636ef824637d33330543e9044b2 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 24 Apr 2019 20:42:29 +0400 Subject: =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=82=D1=80=D0=B5=D1=82=D1=8C=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day4/task3/server.py | 53 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 20 deletions(-) (limited to 'day4/task3/server.py') diff --git a/day4/task3/server.py b/day4/task3/server.py index f4e5ebe..3aea050 100644 --- a/day4/task3/server.py +++ b/day4/task3/server.py @@ -6,6 +6,10 @@ 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 @@ -28,14 +32,15 @@ def handle_request(data): def get_data(connection): buffer = b'' - while len(buffer) < 4: - data = connection.recv(4 - len(buffer)) + # Считываем размер пакета + 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[:4], buffer[4:] + size_packed, buffer = buffer[:DATATYPE_SIZE], buffer[DATATYPE_SIZE:] if not size_packed: raise ConnectionError('Connection was closed') @@ -68,20 +73,28 @@ def handle_connection(connection, address): 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 +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() -- cgit v1.2.3