added REPL mode to python client
This commit is contained in:
parent
e8bb171df2
commit
15d92e9f3a
51
client.py
51
client.py
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user