import sys import socket import selectors import traceback import fishbook_server.libclient as libclient sel = selectors.DefaultSelector() def create_request(action, value): if action == "search": return dict( type="text/json", encoding="utf-8", content=dict(action=action, value=value), ) elif action == "data": print("send data request") return dict( type="binary/custom-client-binary-type", encoding="binary", content=dict(action=action, value=value), ) else: return dict( type="binary/custom-client-binary-type", encoding="binary", content=bytes(action + value, encoding="utf-8"), ) def start_connection(host, port, request): addr = (host, port) print("starting connection to", addr) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setblocking(False) sock.connect_ex(addr) events = selectors.EVENT_READ | selectors.EVENT_WRITE message = libclient.Message(sel, sock, addr, request) sel.register(sock, events, data=message) def send_request(host, port, request): start_connection(host, port, request) message = None try: while True: events = sel.select(timeout=1) for key, mask in events: message = key.data try: message.process_events(mask) except Exception: print( "main: error: exception for", f"{message.addr}:\n{traceback.format_exc()}", ) message.close() # Check for a socket being monitored to continue. if not sel.get_map(): break except KeyboardInterrupt: print("caught keyboard interrupt, exiting") finally: sel.close() return message.payload if message else "no response" def run(host, port, action="test", value="ping"): request = create_request(action, value) response = send_request(host, port, request) print(response)