1. 程式人生 > >解決有關flask-socketio中服務端和客戶端回調函數callback參數的問題(全網最全)

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

分享圖片 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參數的問題(全網最全)