Flask socket io .on('event')未处理,但.on('message')正常工作

时间:2019-08-01 14:42:11

标签: flask socket.io

我正在使用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')

我想念什么吗?谢谢。

1 个答案:

答案 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"