React + Flask -Socket.io: событие отключения сокета от клиента задерживается при закрытии браузера? - PullRequest
0 голосов
/ 08 июля 2020

My React component:

import React, { useState, useEffect } from 'react';
import {Redirect} from "react-router-dom";
import io from "socket.io-client";

function Game({userName, roomCode}) {

    const [users, setUsers] = useState([])

    useEffect(() => {
        const socket = io("http://127.0.0.1:5000")
        socket.emit('join', {userName, roomCode})
        socket.on('message', (msg) => console.log(msg))
        socket.on('updateUsers', (userlist) => {
            setUsers(Object.values(userlist))
        }) 
        return () => {
            socket.disconnect()
        }
        }, [])

    const userItems = users.map((element) =>
        <li>{element.username}</li>)

    return userName === '' ? <Redirect to="/"/> :
        (
        <div>
            <h1>Game Page</h1>
            <h2>Users:</h2>
            <ul>{userItems}</ul>
        </div>
    );
}

export default Game;

Flask:

from flask import Flask, render_template, request
from flask_socketio import SocketIO, send, join_room, leave_room, emit
from users import UserDB

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, cors_allowed_origins="*")

db = UserDB()

@socketio.on('join')
def on_join(data):
    print("Joining!")
    username = data['userName']
    room = data['roomCode']
    join_room(room)
    db.add_user(request.sid, username, room)
    room_list = db.get_room_users(room)
    emit('updateUsers', room_list, broadcast=True, room=room)


@socketio.on('disconnect')
def on_leave():
    user = db.delete_user(request.sid)
    room = user['room']
    room_list = db.get_room_users(room)
    emit('updateUsers', room_list, broadcast = True, room = room)
    print('disconnection!')


if __name__ == '__main__':
    socketio.run(app, debug=True)

Теперь, если я снова нажму в браузере (используя React Router) компонент отключается, и сокет мгновенно отключается. Однако, если я закрою вкладку, розетка отключается примерно через минуту. Как мне сделать так, чтобы сокет отключался при закрытии браузера / вкладки (как это работает в Vanilla JS)?

1 Ответ

0 голосов
/ 09 июля 2020

См. Документ flask -socketio

Отредактируйте параметры ping_timeout и ping_interval, чтобы найти соответствующий ответ.

socketio = SocketIO(app, cors_allowed_origins="*")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...