解決有關flask-socketio中服務端和客戶端回調函數callback參數的問題


 由於工作當中需要用的flask_socketio,所以自己學習了一下如何使用,查閱了有關文檔,當看到回調函數callback的時候,發現文檔里都描述的不太清楚,最后終於琢磨出來了,分享給有需要的朋友

首先看看官方文檔及其譯文

 

 

 

看到這里以后,我就開始照着文檔敲代碼,發現即使我按照文檔里的寫法寫了,也沒有調用我們的回調函數ack

廢話不多說,直接上最終版代碼

index.html

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>index1</title>
    <script type="text/javascript" src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
    <script type="text/javascript" src="//cdn.bootcss.com/socket.io/1.5.1/socket.io.min.js"></script>

    <script type="text/javascript" charset="utf-8">

        $(document).ready(function () {
            var socket = io.connect('http://127.0.0.1:8000/');

            socket.on('connect', function () {
                socket.emit('connect_event', {data: 'client,connected!'});      //客戶端向服務端發起請求鏈接
            });

            socket.on('server_response', function (msg, ack) {
                $('#log').append('<br>' + $('<div/>').text('Received #' + ': ' + msg.data).html()); //將服務端發過來的信息,顯示在頁面上
                ack('client received');    //響應服務端的回調函數,告知服務端,客戶端已收到消息

            });

             socket.on('server_response1', function (msg) {
                $('#log').append('<br>' + $('<div/>').text('Received #' + ': ' + msg.data).html()); //將服務端發過來的信息,顯示在頁面上
                // ack('msg');    //響應服務端的回調函數,告知服務端,客戶端已收到消息

            });

            $('#aa').click(function (event) {
                socket.emit('client_event', {data: $('#emit_data').val()}, function (data) {
                    console.log("server received data", data);  // 此處data為服務端發送過來的回調參數,說明服務端已收到客戶端的消息;

                });
            });


        });

    </script>

</head>
<body>
<h2>WebSokect</h2>
<form id="emit" method="POST" action='#'>
    <input type="text" name="emit_data" id="emit_data" placeholder="Message">
    <input type="button" value="Echo" id="aa">
</form>
<div id='log'></div>
</body>
</html>

 

socket1.py

# -*- coding: utf-8 -*-
from flask import Flask, render_template
from flask_socketio import SocketIO, emit

app = Flask(__name__, template_folder='./')
socketio = SocketIO()
socketio.init_app(app)



def ack(data):  # 服務端回調函數
    print  u'客戶端已收到消息,回調參數為',data  # 服務端回調函數的參數


@app.route('/')
def index():
    return render_template('index.html')


@socketio.on('client_event')
def client_msg(msg):
    print msg
    emit('server_response', {'data': msg['data']}, callback=ack)    # 指定服務端回調函數為ack,參數由客戶端指定
    return 'server received data!'  # 客戶端回調函數的參數


@socketio.on('connect_event')
def connected_msg(msg):
    print u'客戶端建立請求,信息為:',msg['data']
    emit('server_response1', {'data': msg['data']})



if __name__ == '__main__':
    socketio.run(app, debug=True, host='0.0.0.0', port=8000)

 

其實,我想說的已經全部放在了注釋里了,

總結一下,在測試中遇到的問題吧

服務端:在emit中,指定callback,

 客戶端:在socket.on的function里,有兩個參數

    第一個參數,是用來接收服務端return

    如果我們只寫一個就是監聽server_response里的信息,這個參數msg就代表收到的信息

    當我們指定了第二個參數時(可以不和服務端的回調函數ack同名),這個參數就是

 on用來監聽對應通道,emit向對應通道發送消息

socket.on中,第一個參數為通道的名字,第二個參數為一個函數function

  function中,可以有兩個參數,第一個參數是用來接收服務端return的值,第二個參數是回調函數名(隨便取)

  如果服務端在emit中指定了callback,就比如上圖,如果希望客戶端收到消息后給服務端回傳一個消息,觸發服務端的callback即ack函數,則這第二個參數必須指定,否則不會觸發

  如果在服務端沒有指定callback,但是在客戶端指定了第二個參數,則在頁面上會報錯,如下圖

必須對應好,才不會出錯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM