Estoy trabajando para crear un juego en línea usando Python Flass y tecnologías web que usan sockets web para permitir que el juego se ejecute en vivo. Una página del juego es un lobby, en el que se muestran todos los jugadores actuales. Si un usuario se desconecta del juego, por supuesto, debe ser eliminado de la lista de lobby.
Supuse que para que el usuario desaparezca de la lista rápidamente, el navegador del cliente deberá enviar manualmente la desconexión ejecutando socket.disconnect() o enviando otro evento personalizado cuando se descargue la página.
Desafortunadamente, parece que no puedo hacer que esto se ejecute usando el evento onunload : se ejecuta cuando se carga la página, no cuando abandonas la página. Tampoco puedo encontrar una manera de usar el evento onbeforeunload porque ya lo estoy usando para mostrar una ventana emergente de confirmación.
¡Cualquier sugerencia sobre esto sería muy apreciada! ¡Gracias por adelantado!
Mi código del lado del cliente:
window.addEventListener("beforeunload", function(event) {if (!intentionalForward) {event.preventDefault(); event.returnValue = " "}}); window.addEventListener("unload", function () { socket.emit("test","testing unload event"); });Lo que sucede es que llama a socket.emit y asigna el resultado de esa llamada como detector de eventos para unload el evento. Deberías usar una función de cierre como esta:
window.addEventListener("unload", function() { socket.emit("test","testing unload event"); });Logré que esto funcionara correctamente al obligar al cliente a conectarse usando el transporte websocket (al agregar el indicador {transports: ["websocket"]} a mi función io.connect ). Esto significa que el evento de desconexión ahora funciona en el servidor.
NB: se me pidió que instalara y usara gunicorn desde este punto, ya que el servidor de desarrollo del matraz no es compatible con websockets.