SocketIO 没有在 JS 中接收消息
SocketIO not receiving message in JS
我正在尝试使用 socket.io.js 应用程序实现 FlaskSocketIO,以便在前端和我的网络套接字服务器之间进行实时通信
前端代码如下所示:
$(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 端,我可以成功接收消息,但是当我发出 'my respose' 消息时,我可以看到来自 Google Chrome 的网络选项卡中列出的消息,如下所示,但是根据我上面的 javascript 代码,没有针对 'my response' 事件采取任何操作:
ÿ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 插件生成错误格式的消息?
有两种方法可以将消息从服务器发送到客户端。
您正在使用 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
的上下文感知版本和上下文无关版本之间的一个重要区别是,上下文感知版本将默认发送回发送原始事件的客户端,而上下文无关版本emit 将默认向所有客户端广播,因为它不知道上下文。
我正在尝试使用 socket.io.js 应用程序实现 FlaskSocketIO,以便在前端和我的网络套接字服务器之间进行实时通信
前端代码如下所示:
$(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 端,我可以成功接收消息,但是当我发出 'my respose' 消息时,我可以看到来自 Google Chrome 的网络选项卡中列出的消息,如下所示,但是根据我上面的 javascript 代码,没有针对 'my response' 事件采取任何操作:
ÿ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 插件生成错误格式的消息?
有两种方法可以将消息从服务器发送到客户端。
您正在使用 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
的上下文感知版本和上下文无关版本之间的一个重要区别是,上下文感知版本将默认发送回发送原始事件的客户端,而上下文无关版本emit 将默认向所有客户端广播,因为它不知道上下文。