WebServer.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import asyncio
  2. import datetime
  3. import re
  4. import websockets
  5. import logging
  6. import threading
  7. from pokermaster.PokerMasterDataProccesser import deal_message, write_message_2_log_file
  8. logging.basicConfig(level=logging.INFO)
  9. ip = "192.168.137.1"
  10. port = 9999
  11. # 从同目录下读取props.properties文件,获取配置(ip、port)信息
  12. with open("../props.properties", "r") as f:
  13. props = f.readlines()
  14. for prop in props:
  15. if prop.startswith("ip"):
  16. ip = prop.split("=")[1].strip()
  17. if prop.startswith("port"):
  18. port = prop.split("=")[1].strip()
  19. connected_clients = set()
  20. async def echo(websocket, path):
  21. connected_clients.add(websocket)
  22. try:
  23. async for message in websocket:
  24. # await write_message_2_log_file(message)
  25. await deal_message(message, broadcast)
  26. # print(f"Received message: {message}")
  27. await websocket.send("Server says: 你好,服务端收到,连接建立成功")
  28. except websockets.ConnectionClosed as e:
  29. logging.warning(f"Connection closed: {e.reason}")
  30. except Exception as e:
  31. logging.error(f"Error: {e}", exc_info=True)
  32. finally:
  33. connected_clients.remove(websocket)
  34. async def broadcast(message):
  35. if connected_clients:
  36. # 将协程转换为Task对象,并收集到一个列表中
  37. tasks = [asyncio.create_task(client.send(message)) for client in connected_clients]
  38. # 等待所有任务完成
  39. await asyncio.wait(tasks)
  40. else:
  41. print("No clients are connected.")
  42. def start_cli(loop):
  43. while True:
  44. # Enter command (1: Send custom message, 2: Send JS script from file): 翻译成中文并且print
  45. print("输入命令 (1: 发送自定义消息, 2: 发送JS脚本):")
  46. command = input("请输入:")
  47. if command == "1":
  48. message = input("Enter message to send: ")
  49. # 在当前运行的事件循环中安排broadcast任务
  50. loop.call_soon_threadsafe(asyncio.create_task, broadcast(message))
  51. elif command == "2":
  52. sendJsCommand(loop)
  53. else:
  54. print("Unknown command")
  55. def sendJsCommand(loop):
  56. with open("../script.js", "r", encoding="utf-8") as file:
  57. script_content = file.read()
  58. # 去除script中注释的行注释或者块注释
  59. script_content = re.sub(r"//.*?$", "", script_content, flags=re.MULTILINE) # 去除行注释
  60. script_content = re.sub(r"/\*.*?\*/", "", script_content, flags=re.DOTALL) # 去除块注释
  61. # 可选:移除因为删除注释而产生的多余空行
  62. script_content = re.sub(r"\n\s*\n", "\n", script_content, flags=re.MULTILINE)
  63. # 在当前运行的事件循环中安排broadcast任务
  64. loop.call_soon_threadsafe(asyncio.create_task, broadcast(script_content))
  65. async def main():
  66. server = await websockets.serve(echo, ip, port)
  67. try:
  68. await server.wait_closed()
  69. except KeyboardInterrupt:
  70. logging.info("Server stopped by KeyboardInterrupt")
  71. if __name__ == '__main__':
  72. now = datetime.datetime.now()
  73. cache_date = now.strftime("%Y-%m-%d")
  74. cache_hour = now.strftime("%H")
  75. loop = asyncio.get_event_loop()
  76. # 在另一个线程中启动 CLI
  77. cli_thread = threading.Thread(target=start_cli, args=(loop,), daemon=True)
  78. cli_thread.start()
  79. try:
  80. loop.run_until_complete(main())
  81. except Exception as e:
  82. logging.error(f"Server error: {e}", exc_info=True)
  83. finally:
  84. loop.close()