0

我正在尝试使用 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 方面,我可以成功接收到消息,但是当我发出“我的响应”消息时,我可以看到来自 Google Chrome 的“网络”选项卡中列出的消息,如下所示,但根据我上面的 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());
        });

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

4

1 回答 1

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是,上下文感知版本将默认发送回发送原始事件的客户端,而与上下文无关的发送默认为向所有客户端广播,因为它不知道上下文。

于 2016-08-22T22:17:58.607 回答