2016-08-22 80 views
0
沒有收到消息

我想實現一個FlaskSocketIO與前端和我的網絡套接字服務器之間socket.io.js應用實時通信SocketIO在JS

的前端代碼看起來像這樣:

$(document).ready(function() { 
     namespace = '/test'; 
     var socket = io.connect('http://' + document.domain + ':' + location.port + namespace); 
     socket.on('connect', function() { 
      socket.emit('my event', {data: 'Client connected!'}); 
     }); 
     socket.on('my response', function(msg) { 
      $('#log').append('<br>' + $('<div/>').text('Received #' + msg.count + ': ' + msg.data).html()); 
     }); }); 

我使用的瓶的代碼是:

@socketio.on('my event', namespace='/test') 
def receive__message(message): 
    socketio.emit('my response', {'data': 'Backend saw "' + json.dumps(message['data']) + '" from the frontend'}) 
    print("Received from message data:" + json.dumps(message['data'])) 

在FlaskSocketIO方面我可以成功地收到消息,但是當我發出「我respose」的消息,我可以看到日È消息從谷歌瀏覽器網絡選項卡內列出像下面但是不採取任何行動,根據我的JavaScript代碼以上關於「我的響應」事件:

ÿ42["my response",{"data":"Backend saw \"{\"state\": \"Client Connected \"}\" from the frontend"}] 

話雖如此,前端和flasksocketsio之間的通信被成功地進行了但沒有任何反應上的代碼,這部分...

socket.on('my response', function(msg) { 
      $('#log').append('<br>' + $('<div/>').text('Received #' + msg.count + ': ' + msg.data).html()); 
     }); 

我使用警報(味精),甚至執行console.log(味精)嘗試,但他們沒有告訴我任何事情,甚至我看到收到的郵件。任何線索什麼可能是錯誤的?可能Flask爲SocketIO JS插件生成錯誤格式的消息?

回答

1

有兩種方法可以將消息從服​​務器發送到客戶端。您正在使用socketio.emit()函數。這是一個獨立於上下文的函數,對環境一無所知。在你的例子中,你沒有包含namespace參數,所以發出的是在默認命名空間而不是你的/test命名空間上發送到客戶端。如果您添加namespace='/test',您的客戶將會收到信息。

在這種情況下更方便的替代方法是使用上下文感知emit()函數。這隻能在事件處理程序中使用。該函數從事件上下文獲取一些信息,例如,它檢測當前正在處理的事件中使用的命名空間是什麼,並默認在同一命名空間上發射。這將是這樣的:之間

from flask_socketio import emit 

@socketio.on('my event', namespace='/test') 
def receive__message(message): 
    emit('my response', {'data': 'Backend saw "' + json.dumps(message['data']) + '" from the frontend'}) 
    print("Received from message data:" + json.dumps(message['data'])) 

一個重要的區別情境認知和emit背景獨立的版本是,上下文感知版本將默認爲發射回發送始發事件的客戶端,而獨立於上下文的發射將默認廣播給所有客戶,因爲它不知道背景。

+0

工作就像一個魅力!非常感謝! – Mastermind