解決有關flask-socketio中服務端和客戶端回調函數callback參數的問題(全網最全)
阿新 • • 發佈:2018-04-20
分享圖片 ready 發現 ted doc 客戶端 event return 建立
由於工作當中需要用的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,但是在客戶端指定了第二個參數,則在頁面上會報錯,如下圖
必須對應好,才不會出錯
解決有關flask-socketio中服務端和客戶端回調函數callback參數的問題(全網最全)