0


Flask 中使用 WebSocket 通信

WebSocket 是一种计算机通信协议,通过单个 TCP 连接提供全双工通信信道。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API 中,客户端和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在 Flask 中使用

  1. flask-sockets

实现 WebSocket 通信。

Flask-Sockets 官方地址 https://github.com/heroku-python/flask-sockets

1 入门示例

Flask 通过

  1. flask-sockets

实现一个回声服务器作为示例(客户端发送什么数据,服务端就原样返回什么数据,就像回声一样)。

服务端示例:

  1. pip3 install flask
  2. pip3 install flask-sockets

flask_socket_demo.py 为服务端代码:

  1. from flask import Flask
  2. from flask_sockets import Sockets
  3. app = Flask(__name__)
  4. sockets = Sockets(app)@sockets.route('/echo')defecho_socket(ws):whilenot ws.closed:
  5. message = ws.receive()
  6. ws.send(message)@app.route('/')defhello():return'Hello World!'if __name__ =="__main__":from gevent import pywsgi
  7. from geventwebsocket.handler import WebSocketHandler
  8. server = pywsgi.WSGIServer(('127.0.0.1',5000), app, handler_class=WebSocketHandler)
  9. server.serve_forever()

python3 实现 websocket 客户端示例:

  1. pip3 install websocket-client

websocket_client_demo.py 为客户端代码:

  1. from websocket import create_connection
  2. defmain():
  3. url ='ws://127.0.0.1:5000/echo'
  4. ws = create_connection(url)print("获取连接状态:", ws.connected)
  5. ws.send("Hello")
  6. response = ws.recv()print("获取服务器返回的结果: ", response)
  7. ws.close()if __name__ =='__main__':
  8. main()

2 使用 Flask blueprints 示例

  1. from flask import Flask, Blueprint
  2. from flask_sockets import Sockets
  3. html = Blueprint(r'html', __name__)
  4. ws = Blueprint(r'ws', __name__)@html.route('/')defhello():return'Hello World!'@ws.route('/echo')defecho_socket(socket):whilenot socket.closed:
  5. message = socket.receive()
  6. socket.send(message)
  7. app = Flask(__name__)
  8. sockets = Sockets(app)
  9. app.register_blueprint(html, url_prefix=r'/')
  10. sockets.register_blueprint(ws, url_prefix=r'/')if __name__ =="__main__":from gevent import pywsgi
  11. from geventwebsocket.handler import WebSocketHandler
  12. server = pywsgi.WSGIServer(('127.0.0.1',5000), app, handler_class=WebSocketHandler)
  13. server.serve_forever()

3 补充

The websocket interface that is passed into your routes is provided by gevent-websocket. The basic methods are fairly straightforward — send, receive, send_frame, and close.

flask-sockets 是基于 gevent-websocket 实现的,使用的协程。如果接口中使用

  1. time.sleep()

会阻塞进程,得用 **

  1. gevent.sleep()

** 来进行切换使其他协程运行。

举个例子,有一个 http 轮询接口,浏览器每秒向服务端发送一次请求获取数据,那改造为 websocket 后,客户端与服务端建立连接后,客户端不再重复请求服务端了,服务端使用 gevent.sleep(1) 每隔一秒主动向客户端发送一次数据。

  1. @sockets.route('/hello')defecho_socket(ws):
  2. message = socket.receive()# 接收客户端的数据whilenot ws.closed:
  3. ws.send('hello')# 向客户端发送数据
  4. gevent.sleep(1)# 不能使用 time.sleep(1), 否则会阻塞协程的运行
标签: flask websocket python

本文转载自: https://blog.csdn.net/WonderThink/article/details/128112042
版权归原作者 WonderThink 所有, 如有侵权,请联系我们删除。

“Flask 中使用 WebSocket 通信”的评论:

还没有评论