当前位置:   article > 正文

【python flask】给多个webocket客户端推送信息_from geventwebsocket.handler import websockethandl

from geventwebsocket.handler import websockethandler

服务端

  1. from flask import Flask,request
  2. from geventwebsocket.handler import WebSocketHandler
  3. from gevent.pywsgi import WSGIServer
  4. import time,json
  5. app = Flask(__name__)
  6. websocketClient_list = [] # 用于存放所有的websocket客户端对象
  7. @app.route("/")
  8. def index():
  9. ws = request.environ.get("wsgi.websocket")
  10. if not ws: # 使用的是http协议"
  11. pass
  12. else: # 使用的是websocket协议
  13. websocketClient_list.append(ws)
  14. while True:
  15. # 监听连接的websocket客户端,如果message为none,就移除这个客户端
  16. message = ws.receive()
  17. if not message:
  18. websocketClient_list.remove(ws)
  19. ws.close()
  20. break
  21. else:
  22. # 给所有在线的websocket客户端发信息
  23. for client in websocketClient_list:
  24. client.send(json.dumps({"time:":str(time.time())}, ensure_ascii=False))
  25. time.sleep(1)
  26. print("当前在线人数:",len(websocketClient_list)) # 查看当前在线的websocket对象
  27. return "..."
  28. if __name__ == '__main__':
  29. http_server = WSGIServer(("127.0.0.1", 5000), app, handler_class=WebSocketHandler)
  30. print("server start")
  31. http_server.serve_forever()

客户端

地址:http://www.websocket-test.com/

使用该在线工具作为websocket客户端

测试

我这里开了两个客户端:

当服务端收到任何一个客户端发送的消息时,就会给所有在线的客户端发送信息,并打印当前在线人数。当有客户端断开后,就清除这个客户端对象,然后再次打印在线人数。

改进

但是上述代码的问题是只有接收到客户端的信息时,服务端才会发送下一条信息。于是我将监听客户端的代码作为一个线程分离出去,就解决了这个问题,如下所示:

(该段代码不论有没有接收到客户端的信息,都会主动向所有在线的客户端发送信息,而且当有客户端断开时,服务端会将这个断开的客户端close)

  1. from flask import Flask,request
  2. from geventwebsocket.handler import WebSocketHandler
  3. from gevent.pywsgi import WSGIServer
  4. from gevent import monkey
  5. import time,json,threading
  6. app = Flask(__name__)
  7. monkey.patch_all()
  8. def thread_listenClient(ws):
  9. while True:
  10. # 监听连接的websocket客户端,如果message为none,就移除这个客户端
  11. message = ws.receive()
  12. if not message:
  13. websocketClient_list.remove(ws)
  14. ws.close()
  15. break
  16. websocketClient_list = [] # 用于存放所有的websocket客户端对象
  17. @app.route("/")
  18. def index():
  19. ws = request.environ.get("wsgi.websocket")
  20. thread_obj = threading.Thread(target=thread_listenClient, args=(ws,))
  21. thread_obj.daemon = True
  22. thread_obj.start()
  23. if not ws: # 使用的是http协议"
  24. pass
  25. else: # 使用的是websocket协议
  26. websocketClient_list.append(ws)
  27. while True:
  28. # 给所有在线的websocket客户端发信息
  29. for client in websocketClient_list:
  30. client.send(json.dumps({"time:":str(time.time())}, ensure_ascii=False))
  31. time.sleep(1)
  32. print("当前在线人数:",len(websocketClient_list)) # 查看当前在线的websocket对象
  33. return "..."
  34. if __name__ == '__main__':
  35. http_server = WSGIServer(("127.0.0.1", 5000), app, handler_class=WebSocketHandler)
  36. print("server start")
  37. http_server.serve_forever()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/85396
推荐阅读
相关标签
  

闽ICP备14008679号