我正在使用flask_socketio
开发Flask应用程序,但是事件不起作用。
我用@socketio.on('message')
测试过,这部分工作正常,但是@socketio.on('my_event')
无效。
这是我的服务器端代码:
@socketio.on('message')
def handle_message(event, data):
emit('ping', data)
print('received message: ' + event, data)
@socketio.on('ping')
def ping(message):
print('event', message)
emit('pong', message)
和客户端代码:
<script type="text/javascript" src="{{ url_for('static', filename='lib/socket.io.js') }}"></script>
<script type="text/javascript" src="{{ url_for('static', filename='lib/jquery-3.4.1.min.js') }}"></script>
<script type="text/javascript">
var socket;
$(function () {
socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('connect', function() {
console.log('connected');
socket.send('ping', {foo:'bar'});
});
socket.on('ping', function (data) {
console.log('ping', data);
});
socket.on('pong', function (data) {
console.log('it works!!!', data);
});
});
在服务器端,我得到了:
received message: ping {'foo': 'bar'}
表示来自客户端的消息是由@socketio.on('message')
发送和拦截的,而不是@socketio.on('ping')
我想念什么吗?谢谢。
答案 0 :(得分:1)
它完全按照您的描述工作。
一个片段:
@socketio.on('message')
def handle_message(event, data):
emit('ping', data)
print('received message: ' + event, data)
处理一个唯一的特定事件,称为message
。通过调用socket.send(data)
在客户端触发该事件。使用send()
时不必提供事件名称。
下一个片段:
@socketio.on('ping')
def ping(message):
print('event', message)
emit('pong', message)
处理称为ping
的唯一事件。要触发此类事件(命名事件),您需要明确提供其名称,并使用emit(event_name, data)
代替send(data)
。
如果您还想触发'my_event'
事件,则需要调用其他emit()
:
var socket;
$(function () {
socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('connect', function() {
console.log('connected');
socket.send('ping', {foo:'bar'});
socket.emit('my_event', {foo: 'bar'});
});
socket.on('ping', function (data) {
console.log('ping', data);
});
socket.on('pong', function (data) {
console.log('it works!!!', data);
});
});
此外,当您使用socket.send('ping', {foo:'bar'});
时,实际上您用两个参数调用了消息事件:'ping'
和{foo:'bar'}
。我认为这不是您的意图,您只需要一个命名事件,即:"my_event"