Flask_SocketIO Не испускает пользовательские события - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть приложение Flask_SocketIO, которое должно реализовать систему групп чата. Клиент, который взаимодействует с ним, является флаттер-приложением. Я написал тест, чтобы увидеть, работают ли события socketio. это сработало один раз, но потом остановилось. сервер получает сообщения клиента, но не отправляет их обратно клиенту. Кроме того, Evets, связанные с подключением (подключение, отключение, ошибка), кажется, полностью работает. вызываются клиентские обратные вызовы для этих событий.

Мой тестовый клиент флаттера:

void main() async {
  setupLocator();
  final api = locator<Api>();
  final socketService = locator<SocketService>();
  Message msg = Message(
      msgId: null,
      content: "Hello!",
      senderId: 1,
      senderName: 'tair',
      sendtime: DateTime.now().toString(),
      groupId: 1);

  runApp(
    MaterialApp(
      home: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
                child: Text("Disconnect"),
                onPressed: () {
                  socketService.leave(1, 1);
                }),
            RaisedButton(
              child: Text("Send"),
              onPressed: () {
                socketService.sendMessage(msg);
              },
            ),
            RaisedButton(
              child: Text("Connect"),
              onPressed: () {
                socketService.connect(1, 1, (data) {
                  print('Data!');
                  print(data);
                });
              },
            ),
          ],
        ),
      ),
    ),
  );
  SharedPreferences.setMockInitialValues({});

  await api.login('tair', '1234');
  await socketService.getToken();
  socketService.connect(1, 1, (data) {
    print('Data!');
    print(data);
  });
  • Api: класс, взаимодействующий с остальные API. не связано
  • SocketService: класс, который отправляет и прослушивает события. я даю параметры метода connect(), чтобы присоединиться к socketio-комнате на стороне сервера.
  • locator: внедрение зависимостей с использованием пакета pub get_it. также не связано

Вот события на моем сервере:

@sock.on('join')
def join_group_room(data):
    print(data)
    token = data['token']
    if token in user_token.keys():
        group = Group.query.filter_by(id=int(data['groupId'])).first()
        if group.temp_participants is None:
            group.temp_participants = data['userId'] + ','
        else:
            group.temp_participants += data['userId'] + ','

        db.session.commit()
        join_room(data['groupId'])
        #print(rooms())
    else:
        emit('error', 'Invalid token')


@sock.on('message')
def message_room(data):
    print(data)
    token = data['token']
    if token in user_token.keys():
        message = Message(content=data['message'], groupid=int(data['groupId']), username=user_token[token],
                          datetime=data['datetime'])

        db.session.add(message)
        db.session.commit()

        participants = Group.query.filter_by(id=message.groupid).first().participants.split(",")
        temp_participants = Group.query.filter_by(id=message.groupid).first().temp_participants.split(",")

        for participant in participants:
            if participant not in temp_participants:
                pushbots.push_batch(platform=pushbots.PLATFORM_ANDROID,
                                              alias=participant,
                                              msg='A new message arrived', payload={'data': {'message': message.content,
                                                                                             'messageId': message.id,
                                                                                             'username': user_token[
                                                                                                 token],
                                                                                             'datetime': message.datetime,
                                                                                             'groupId': message.groupid,
                                                                                             'userId': User.query.filter_by(
                                                                                                 username=user_token[
                                                                                                    token]).first().id}})
        print("Emitting")
        emit('message', {'message': message.content, 'messageId': message.id,
                         'username': user_token[token], 'datetime': message.datetime,
                         'groupId': message.groupid,
                         'userId': User.query.filter_by(username=user_token[token]).first().id},
             room=message.groupid)
        sock.sleep(0)

    else:
        emit('error', 'Invalid token')


@sock.on('leave')
def leave_group_room(data):
    print(data)
    token = data['token']
    if token in user_token.keys():
        group = Group.query.filter_by(id=int(data['groupId'])).first()
        group.temp_participants = str(group.temp_participants.split(",").remove(data['userId'])).strip('[]')
        db.session.commit()

        leave_room(data['groupId'])
    emit('error', 'Invalid token')

Я использую eventlet в качестве async_mode для приложения socketio. Я искал в Интернете решения, и многие люди сказали, что я должен добавить следующую строку в основной скрипт:

import eventlet
eventlet.monkey_patch()

Кроме того, по словам моего партнера по этому проекту, события на его компьютере работают нормально

для более подробного объяснения, вот ссылка на мое git репо, так что вы можете посмотреть весь код: My git репо (находится на ветке интеграции / ClientServer)

Спасибо за помощь!

1 Ответ

0 голосов
/ 22 апреля 2020

Соответственно, имена комнат могут быть только строками, но функция emit не выдаст ошибку, если вы передадите int в качестве параметра комнаты.

...