2016-08-22 75 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