目录
Flask-Sockets和Flask-SocketIO之间的主要区别在于前者仅仅将WebSocket协议(通过使用gevent-websocket项目)进行包装,因此它只适用于原生支持WebSocket协议的浏览器,对于那些不支持WebSocket协议的较老的浏览器,就无法使用它了。 Flask-SocketIO则不同,通过前面的介绍,读者应该已经知道了它不仅实现了WebSocket协议,并且对于那些不支持WebSocket协议的旧版浏览器,使用它也能够实现相同的效果。新版旧版的浏览器都能使用他
另一个区别是Flask-SocketIO实现了SocketIO Javascript库公开的消息传递协议。 Flask-Sockets只是实现通信通道,发送的是完全取决于应用程序。
Flask-SocketIO还为事件处理程序创建了一个类似flask的常规视图函数的环境,包括创建应用程序和请求上下文。 然而,在文档中会介绍一些重要的例外情形。
Flask-SocketIO服务器端程序
如下是一个使用了Flask-SocketIO的Flask应用程序。
from flask import Flask, render_template from flask_socketio import SocketIO, emit app = Flask(__name__) app.config[\'SECRET_KEY\'] = \'secret!\' socketio = SocketIO(app) @app.route(\'/\') def index(): return render_template(\'index.html\') @socketio.on(\'my event\', namespace=\'/test\') def test_message(message): emit(\'my response\', {\'data\': message[\'data\']}) @socketio.on(\'my broadcast event\', namespace=\'/test\') def test_message(message): emit(\'my response\', {\'data\': message[\'data\']}, broadcast=True) @socketio.on(\'connect\', namespace=\'/test\') def test_connect(): emit(\'my response\', {\'data\': \'Connected\'}) @socketio.on(\'disconnect\', namespace=\'/test\') def test_disconnect(): print(\'Client disconnected\') if __name__ == \'__main__\': socketio.run(app)
SocketIO客户端程序
$(document).ready(function(){ var socket = io.connect(\'http://\' + document.domain + \':\' + location.port + \'/test\'); socket.on(\'my response\', function(msg) { $(\'#log\').append(\'<p>Received: \' + msg.data + \'</p>\'); }); $(\'form#emit\').submit(function(event) { socket.emit(\'my event\', {data: $(\'#emit_data\').val()}); return false; }); $(\'form#broadcast\').submit(function(event) { socket.emit(\'my broadcast event\', {data: $(\'#broadcast_data\').val()}); return false; }); });
使用Flask-Sockets
sever端:
from flask import Flask from flask_sockets import Sockets import datetime import time import random app = Flask(__name__) sockets = Sockets(app) @sockets.route(\'/echo\') def echo_socket(ws): while not ws.closed: now = datetime.datetime.now().isoformat() + \'Z\' ws.send(now) #发送数据 time.sleep(1) @app.route(\'/\') def hello(): return \'Hello World!\' if __name__ == \"__main__\": from gevent import pywsgi from geventwebsocket.handler import WebSocketHandler server = pywsgi.WSGIServer((\'\', 5000), app, handler_class=WebSocketHandler) print(\'server start\') server.serve_forever()
client端:
<!DOCTYPE html> <html lang=\"en\"> <head> <meta charset=\"UTF-8\"> <title>Title</title> <script src=\"https://cdn.bootcss.com/jquery/3.2.0/jquery.js\"></script> </head> <body> <div id=\"time\" style=\"width: 300px;height: 50px;background-color: #0C0C0C; color: white;text-align: center;line-height: 50px;margin-left: 40%;font-size: 20px\"></div> <script> var ws = new WebSocket(\"ws://127.0.0.1:5000/echo\"); #连接server ws.onmessage = function (event) { content = document.createTextNode(event.data); # 接收数据 $(\"#time\").html(content); }; </script> </body> </html>
© 版权声明
THE END
暂无评论内容