added REPL mode to python client

This commit is contained in:
Илья Глазунов 2026-01-11 02:45:34 +03:00
parent e8bb171df2
commit 15d92e9f3a

View File

@ -3,6 +3,18 @@ import struct
import argparse import argparse
def print_logo():
print(r"""
_ _____ ______ _____ _____ _____
| | | __ \| ____| __ \_ _|/ ____|
_ __ ___ | |_ __ _ | |__) | |__ | | | || | | (___
| '_ \ / _ \| __| / _` | | _ /| __| | | | || | \___ \
| | | | (_) | |_ | (_| | | | \ \| |____| |__| || |_ ____) |
|_| |_|\___/ \__| \__,_| |_| \_\______|_____/_____|_____/
""")
def recv_exact(sock: socket.socket, n: int) -> bytes: def recv_exact(sock: socket.socket, n: int) -> bytes:
data = b'' data = b''
while len(data) < n: while len(data) < n:
@ -24,23 +36,50 @@ def recv_frame(sock: socket.socket) -> bytes:
return recv_exact(sock, length) return recv_exact(sock, length)
def main(): def main():
print_logo()
parser = argparse.ArgumentParser(description='NOT(Redis) client') parser = argparse.ArgumentParser(description='NOT(Redis) client')
parser.add_argument('-H', '--host', type=str, required=False, default='127.0.0.1', help='Server host') parser.add_argument('-H', '--host', type=str, required=False, default='127.0.0.1', help='Server host')
parser.add_argument('-P', '--port', type=int, required=False, default=6379, help='Server port') parser.add_argument('-P', '--port', type=int, required=False, default=6379, help='Server port')
parser.add_argument('-M', '--message', type=str, required=False, default='hello', help='Message to send') parser.add_argument('-M', '--message', type=str, required=False, default=None, help='Message to send (if not provided, starts interactive shell)')
args = parser.parse_args() args = parser.parse_args()
try: try:
with socket.create_connection((args.host, args.port)) as sock: with socket.create_connection((args.host, args.port)) as sock:
send_frame(sock, args.message.encode()) if args.message:
response = recv_frame(sock) send_frame(sock, args.message.encode())
print('Message sent:', args.message) response = recv_frame(sock)
print('Server says:', response.decode("utf-8", errors='replace')) print('Message sent:', args.message)
print('Server says:', response.decode("utf-8", errors='replace'))
else:
print(f"Connected to {args.host}:{args.port}")
print("Type 'quit' or 'exit' to leave.")
import readline
while True:
try:
prompt = f"{args.host}:{args.port}> "
cmd_line = input(prompt).strip()
if not cmd_line:
continue
if cmd_line.lower() in ('quit', 'exit'):
break
send_frame(sock, cmd_line.encode())
response = recv_frame(sock)
print(response.decode("utf-8", errors='replace'))
except KeyboardInterrupt:
print("\nType 'quit' or 'exit' to leave.")
except EOFError:
break
except ConnectionRefusedError as e: except ConnectionRefusedError as e:
print('Connection refused by server:', e) print('Connection refused by server:', e)
exit(1) exit(1)
except ConnectionError as e: except ConnectionError as e:
print('Failed to connect to server:', e) print('Connection error:', e)
exit(1) exit(1)
except Exception as e: except Exception as e:
print('Unexpected error:', e) print('Unexpected error:', e)