ws_echo_server.py (1957B)
1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 #*************************************************************************** 4 # _ _ ____ _ 5 # Project ___| | | | _ \| | 6 # / __| | | | |_) | | 7 # | (__| |_| | _ <| |___ 8 # \___|\___/|_| \_\_____| 9 # 10 # Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 11 # 12 # This software is licensed as described in the file COPYING, which 13 # you should have received as part of this distribution. The terms 14 # are also available at https://curl.se/docs/copyright.html. 15 # 16 # You may opt to use, copy, modify, merge, publish, distribute and/or sell 17 # copies of the Software, and permit persons to whom the Software is 18 # furnished to do so, under the terms of the COPYING file. 19 # 20 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 21 # KIND, either express or implied. 22 # 23 # SPDX-License-Identifier: curl 24 # 25 ########################################################################### 26 # 27 import argparse 28 import asyncio 29 import logging 30 31 from websockets import server 32 from websockets.exceptions import ConnectionClosedError 33 34 35 async def echo(websocket): 36 try: 37 async for message in websocket: 38 await websocket.send(message) 39 except ConnectionClosedError: 40 pass 41 42 43 async def run_server(port): 44 async with server.serve(echo, "localhost", port): 45 await asyncio.Future() # run forever 46 47 48 def main(): 49 parser = argparse.ArgumentParser(prog='scorecard', description=""" 50 Run a websocket echo server. 51 """) 52 parser.add_argument("--port", type=int, 53 default=9876, help="port to listen on") 54 args = parser.parse_args() 55 56 logging.basicConfig( 57 format="%(asctime)s %(message)s", 58 level=logging.DEBUG, 59 ) 60 61 asyncio.run(run_server(args.port)) 62 63 64 if __name__ == "__main__": 65 main()