websocket_server.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import asyncio
  2. import json
  3. import threading
  4. import websockets
  5. import os
  6. ##
  7. from message_base import MessageBase
  8. class WebServer:
  9. def __init__(self, host, port, message_base: MessageBase):
  10. self.host = host
  11. self.port = port
  12. self.clients = []
  13. self.message_base = message_base
  14. async def echo(self, websocket, path):
  15. self.clients.append(websocket)
  16. client_ip, client_port = websocket.remote_address
  17. print(f"客户连接:{client_ip}:{client_port}")
  18. while True:
  19. try:
  20. recv_text = await websocket.recv()
  21. if recv_text:
  22. byte_array = recv_text
  23. print("ws收到", byte_array)
  24. self.message_base.add("ws_recv", byte_array)
  25. send_text = self.message_base.get("ws_send")
  26. if send_text:
  27. byte_array = send_text
  28. print("ws发送", byte_array)
  29. await websocket.send(byte_array)
  30. # data = json.loads(recv_text)
  31. # device = data.get("device")
  32. # if device:
  33. # self.message_base.add(device, data)
  34. # else:
  35. # continue
  36. except websockets.ConnectionClosed:
  37. print("ConnectionClosed...") # 链接断开
  38. self.clients.remove(websocket)
  39. break
  40. except websockets.InvalidState:
  41. print("InvalidState...") # 无效状态
  42. self.clients.remove(websocket)
  43. break
  44. except Exception as e:
  45. print("Err in {}[{}]:\n {}".format(os.path.basename(e.__traceback__.tb_frame.f_globals["__file__"]), e.__traceback__.tb_lineno, e))
  46. def connect(self):
  47. print("连接成功!")
  48. asyncio.set_event_loop(asyncio.new_event_loop())
  49. start_server = websockets.serve(self.echo, self.host, self.port)
  50. asyncio.get_event_loop().run_until_complete(start_server)
  51. asyncio.get_event_loop().run_forever()
  52. def run(self):
  53. t = threading.Thread(target=self.connect)
  54. t.start()
  55. print("已启动!")
  56. if __name__ == '__main__':
  57. mb = MessageBase()
  58. ws = WebServer("192.168.6.28", 8001, mb)
  59. ws.run()