{"library":"simple-websocket","code":"import time\nimport threading\nfrom simple_websocket import Client, Server, ConnectionClosed\n\ndef run_server():\n    print(\"Starting synchronous WebSocket echo server on ws://localhost:8765\")\n    server = Server('ws://localhost:8765')\n    while True:\n        try:\n            print(\"Server: Waiting for connection...\")\n            client_ws = server.accept()\n            print(\"Server: Client connected!\")\n            while True:\n                try:\n                    message = client_ws.receive()\n                    print(f\"Server received: {message}\")\n                    client_ws.send(f\"Echo: {message}\")\n                except ConnectionClosed:\n                    print(\"Server: Client disconnected.\")\n                    break\n        except ConnectionClosed:\n            print(\"Server: Server closed or error.\")\n            break\n\ndef run_client():\n    print(\"Starting synchronous WebSocket client...\")\n    time.sleep(1) # Give server time to start\n    try:\n        client = Client('ws://localhost:8765')\n        print(\"Client connected!\")\n        for i in range(3):\n            message = f\"Hello from client {i+1}\"\n            print(f\"Client sending: {message}\")\n            client.send(message)\n            response = client.receive()\n            print(f\"Client received: {response}\")\n            time.sleep(0.5)\n        client.close()\n        print(\"Client disconnected.\")\n    except ConnectionClosed:\n        print(\"Client: Connection closed prematurely.\")\n    except Exception as e:\n        print(f\"Client error: {e}\")\n\nif __name__ == '__main__':\n    server_thread = threading.Thread(target=run_server)\n    server_thread.daemon = True # Allows main program to exit even if thread is running\n    server_thread.start()\n\n    run_client()\n\n    print(\"Main program finished.\")\n","lang":"python","description":"This example demonstrates a basic synchronous WebSocket echo server and client. The server listens for connections, echoes received messages, and handles client disconnections. The client connects, sends a few messages, receives echoes, and then disconnects.","tag":null,"tag_description":null,"last_tested":"2026-04-24","results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]}