SocketIO没有在JS中接收消息

时间:2016-08-22 13:35:51

标签: jquery python-2.7 socket.io flask-socketio flask-sockets

我尝试使用socket.io.js应用程序实现FlaskSocketIO,以便在前端和我的Web套接字服务器之间进行实时通信

前端代码如下:

 $(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());
        }); });

我在Flask中使用的代码是:

@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端,我可以成功收到消息但是当我发出&#39; my respose&#39;消息我可以在下面的Google Chrome中看到“网络”标签中列出的消息,但是根据我上面的javascript代码没有采取任何措施来回复我的回复&#39;事件:

ÿ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());
        });

我尝试过使用alert(msg)甚至是console.log(msg),但是即使我看到收到的消息,他们也没有给我看任何东西......任何可能出错的线索?也许Flask以错误的格式为SocketIO JS插件生成消息?

1 个答案:

答案 0 :(得分:1)

有两种方法可以将消息从服​​务器发送到客户端。

您正在使用socketio.emit()功能。这是一个与上下文无关的函数,它对环境一无所知。在您的示例中,您没有包含namespace参数,因此emit将在默认命名空间而不是/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版本之间的一个重要区别是,上下文感知版本将默认发回给发送原始事件的客户端,而与上下文无关的发送将默认为广播给所有客户,因为它不了解上下文。