Почему при перезагрузке сервера у меня каждый раз добавляется один вебсокет?

Ссылка скопирована
1 ответ

стоит nodemon я не вношу изменений в сервер, просто нажимаю сохранить, он перезагружает сервер и на клиенте у меня каждый раз +1 соединение, 1 из них постоянно обменивается. Вопрос следующий - почему старое продолжает висеть со статусом 101? или это нормальное поведение?

export const socketMiddleware = (   wsActions: TSocketChatMiddlewareActions ): Middleware<{}, RootState> => {   return (store) => {     let socket: Socket | null = null      return (next) => (action) => {       const { dispatch } = store       const {         wsConnect,         wsDisconnect,         wsSendMessage,         wsConnecting,         wsOnOpen,         wsOnClose,         wsOnError,         wsOnMessage,       } = wsActions        if (wsConnect.match(action)) {         console.log('connect', socket)         socket = io('http://localhost:5000', {           path: '/api/messages',           transports: ['websocket'],           reconnectionDelay: 5000,         })          dispatch(wsConnecting())       }        if (socket) {         socket.on('connect', () => {           console.log('socket open = ', socket!.id)           //  dispatch(wsOnOpen())         })          socket.on('connect_error', (error) => {           console.log('socket error', error.message)           //  dispatch(wsOnError(`Error === ${error.message}`))         })          socket.on('disconnect', (reason: any) => {           console.log('socket close', reason)            // dispatch(wsOnClose())         })          if (wsDisconnect.match(action)) {           console.log('socket disconnect')           socket.disconnect()           socket = null            dispatch(wsOnClose())         }       }        next(action)     }   } }

export const socketMiddleware = ( wsActions: TSocketChatMiddlewareActions ): Middleware<{}, RootState> => { return (store) => { let socket: Socket | null = null return (next) => (action) => { const { dispatch } = store const { wsConnect, wsDisconnect, wsSendMessage, wsConnecting, wsOnOpen, wsOnClose, wsOnError, wsOnMessage, } = wsActions if (wsConnect.match(action)) { console.log('connect', socket) socket = io('http://localhost:5000', { path: '/api/messages', transports: ['websocket'], reconnectionDelay: 5000, }) dispatch(wsConnecting()) } if (socket) { socket.on('connect', () => { console.log('socket open = ', socket!.id) // dispatch(wsOnOpen()) }) socket.on('connect_error', (error) => { console.log('socket error', error.message) // dispatch(wsOnError(`Error === ${error.message}`)) }) socket.on('disconnect', (reason: any) => { console.log('socket close', reason) // dispatch(wsOnClose()) }) if (wsDisconnect.match(action)) { console.log('socket disconnect') socket.disconnect() socket = null dispatch(wsOnClose()) } } next(action) } } }

Почему при перезагрузке сервера у меня каждый раз добавляется один вебсокет?

Дополнительно:

может быть, что это особенности дебаг режима?

  • chemdev, я не знаю, я вот хочу узнать я накосячил или это в порядке нормы, в интернетах не нашел
  • А вы сокет-то закрываете перед перезапуском сервера? А периодический пинг делаете с проверкой, что если нет связи с сервером - переподключиться к серверу? А проверку перед подключением к серверу на существующее подключение с закрытием если оно есть, делаете?
  • VoidVolker, 1. нет, я просто сервер перезапустил 2. ну если связи нет, то socket.io сам переподключается, кроме тех случаев когда принудительно был вызван socket.disconnect(). 3. при перезагрузке сервера происходит событие "disconnect" с ошибкой "transport close" и он под капотом какие то манипуляции производит на строке webcoket:39 и получается новый сокет
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Кирилл JS Ответ

    При перезагрузке сервера у вас каждый раз добавляется один вебсокет, вероятно, потому что вы не закрываете соединение с вебсокетом после завершения работы. Это может привести к накоплению открытых соединений с вебсокетом при каждой перезагрузке сервера.

    Чтобы решить эту проблему, необходимо убедиться, что вы закрываете соединение с вебсокетом перед завершением работы сервера. Для этого вам нужно добавить обработчик события закрытия сервера, который будет закрывать все активные соединения с вебсокетом.

    Пример кода на PHP:

    // Создаем новый сервер вебсокета
    $server = new WebSocket\Server('127.0.0.1', 8080);
     
    // Обработчик события закрытия сервера
    $server->on('close', function () use ($server) {
        // Закрываем все активные соединения с вебсокетом
        foreach ($server->getConnections() as $connection) {
            $connection->close();
        }
    });
     
    // Запускаем сервер
    $server->run();

    // Создаем новый сервер вебсокета $server = new WebSocket\Server('127.0.0.1', 8080); // Обработчик события закрытия сервера $server->on('close', function () use ($server) { // Закрываем все активные соединения с вебсокетом foreach ($server->getConnections() as $connection) { $connection->close(); } }); // Запускаем сервер $server->run();

    Этот код добавляет обработчик события закрытия сервера, который закрывает все активные соединения с вебсокетом перед завершением работы сервера. Таким образом, при каждой перезагрузке сервера не будет добавляться новое соединение с вебсокетом.

    Надеюсь, данное решение поможет вам решить проблему с накоплением открытых соединений с вебсокетом при перезагрузке сервера. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно