flask上使用websocket的方法示例

目录

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
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容