Hay varias respuestas a esta pregunta, pero están desactualizadas (¿creo que ya no existe el evento de "reconexión"?) O simplemente no me funciona.
Tengo una tonelada de datos que el cliente está esperando del servidor a través de sockets socket.io. Está bien hasta 10-15 minutos más tarde con más de 1600 resultados de que el zócalo se vuelve a conectar. Después de que ocurre la reconexión, ya no obtengo los datos que emite el servidor, lo que supongo que se debe a que perdí los eventos de la conexión del socket original.
Tengo que actualizar para seguir obteniendo esos datos.
¿Cómo me vuelvo a conectar a socket.io después de cada reconexión?
Cliente:
socket.js (contexto)
import { createContext } from 'react'; import io from 'socket.io-client'; export const socket = io('http://localhost:5000'); export const SocketContext = createContext();Diseño.js
import { socket, SocketContext } from '../context/socket' function MyApp({ Component, pageProps }) { return <SocketContext.Provider value={socket}> <Layout> <Component {...pageProps} /> </Layout> </SocketContext.Provider> }página (siguiente.js)
import { SocketContext } from '../context/socket'; ... const socket = useContext(SocketContext); useEffect(() => { socket.emit('joined', socketChannel); socket.on(socketChannel, handleStream); }, []);Servidor:
index.js (Usa fastify-socket.io )
fastify.io.on('connection', socket => { socket.on('joined', (channel) => { socket.join(channel); }) }); redis.subscriber.on('message', (channel, message) => { io.to(channel).emit(channel, message); });Socket.io abandonará automáticamente las habitaciones cuando tenga una desconexión.
Las habitaciones se dejan automáticamente al desconectarse.
en useEffect() , te unirás a la sala una vez:
socket.emit('joined', socketChannel); socket.on(socketChannel, handleStream);Dos opciones:
useEffect(() => { socket.on(socketChannel, handleStream); // connect fires when connected, also after reconnected socket.on('connect', () => { console.log('connect', socket.connected); // automatically join the room socket.emit('joined', socketChannel); }); }, []); io.on('connection', (socket) => { console.log(`${socket.id} connected`); // automatically join the room socket.join(socketChannel); ...