import socket import threading def handle_client(client_socket: socket.socket, stop_event: threading.Event) -> None: try: while not stop_event.is_set(): data = client_socket.recv(1024) if not data: break print(f"Received: {data.decode('utf-8')}") except socket.timeout: print("Client disconnected") stop_event.set() client_socket.close() def send_data(client_socket: socket.socket, stop_event: threading.Event) -> None: counter = 1 while not stop_event.is_set(): data = f"Hi {counter}!" client_socket.sendall(data.encode('utf-8')) counter += 1 stop_event.wait(1) def main() -> None: server: socket.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('0.0.0.0', 12345)) server.listen(1) ip_address = socket.gethostbyname(socket.gethostname()) print(f"Server listening on {ip_address}:12345") while True: client_socket, addr = server.accept() print(f"Accepted connection from {addr}") client_socket.settimeout(3) stop_event = threading.Event() receiver = threading.Thread(target=handle_client, args=(client_socket, stop_event)) sender = threading.Thread(target=send_data, args=(client_socket, stop_event)) receiver.start() sender.start() if __name__ == "__main__": main()