Flask SocketIO基本使用

Flask-SocketIO是一个用于建立WebSocket全双工通信的Flask扩展。客户端应用可以使用任一SocketIO官方客户端库实现,或可以建立持久连接的兼容客户端实现。 1.安装 pip install flask-socketio Flask-SocketIO提供三种异步服务机制: eventlet:支持长轮询和websocket gevent:需使用第三方库 Werkzeug:仅支持长轮询 2.初始化 from flask import Flask, render_template from flask_socketio import SocketIO app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = SocketIO(app) if __name__ == '__main__': socketio.run(app) 应用必须给客户端返回一个html页面加载SocketIO库,并且建立连接: <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script> <script type="text/javascript" charset="utf-8"> var socket = io.connect('http://' + document.domain + ':' + location.port); socket.on('connect', function() { socket.emit('my event', {data: 'I\'m connected!'}); }); </script> 3.接收消息 使用SocketIO时,客户端和服务端以事件的方式接收消息-事件驱动。在客户端,javascript使用回调函数。在服务端,Flask-SocketIO需要注册事件处理函数,类似于路由-视图函数机制。 下面的例子创建服务端无名事件处理函数: @socketio.on('message') def handle_message(message): print('received message: ' + message) 上面的例子使用字符串消息,也可以使用json格式的消息: @socketio.on('json') def handle_json(json): print('received json: ' + str(json)) 最灵活的事件类型是使用定制事件名称。这些事件的消息数据格式可以是字符串、字节、整数或者json: @socketio.on('my event') def handle_my_custom_event(json): print('received json: ' + str(json)) 定制的命名事件支持多参数: @socketio.on('my event') def handle_my_custom_event(arg1, arg2, arg3): print('received args: ' + arg1 + arg2 + arg3) 命名事件是最灵活的,因为命名事件消除了包含附加元数据(描述消息类型)的需要。Flask-socketIO也支持SocketIO命名域,SocketIO命名域允许客户端复用socket(多个连接建立在同一物理socket)。 @socketio.on('my event', namespace='/test') def handle_my_custom_namespace_event(json): print('received json: ' + str(json)) 当SocketIO没有显式指定命名域,全局命名域‘/’将会被使用。 当装饰器语法不太合适时,on_event方法可被使用: def my_function_handler(data): pass socketio.on_event('my event', my_function_handler, namespace='/test') 客户端可能请求一个承认的回调函数,该函数确认接收发送的消息。处理函数的任何返回值将会作为参数递送给客户端的回调函数: ...

2019-04-11 · Jerry Wang