Задать вопрос
RomanDillerNsk
@RomanDillerNsk
JavaScript

Почему может ws клиент так себя вести?

Коллеги, доброго времени суток, прошу помощи или совета.

В общем суть такая, есть сервер, есть клиент, который я собственно пишу на NodeJS. Все запускаю локально на ubuntu 18.04 через WebStorm. Собственно все норм, приложение запустилось, подключилось по ws к серверу пошли сообщения, туда сюда, но есть момент)) я оставляю комп на некоторое время, а через это самое время на сервере происходит disconnect с моим клиентом, при чем событие close или error у ws не срабатывает, т.е. клиент как бы подключен а на сервере нет его.

Может у кого то была такая ситуация, в чем дело может быть?
На всякий случай код клиента (ну мало ли):

'use strict';
const WebSocket = require('ws');

const logger = require('../logger');
const event = require('../eventBus');

module.exports = class WebSockets {

    constructor() {

        this.url ='wss://test.ru/ws';
        this.client = null;
        this.timeout = 0;
        this.time = 1000 * 10;

        event.bus.on('ws:connect', this.connect.bind(this));
        event.bus.on('ws:send', this.sendMessage.bind(this));

    }

    connect() {

        this.client = new WebSocket(this.url, '',{});

        this.client.addEventListener('open', this._openHandler.bind(this));
        this.client.addEventListener('message', this._messageHandler.bind(this));
        this.client.addEventListener('error', this._errorHandler.bind(this));
        this.client.addEventListener('close', this._reconnection.bind(this));

    }

    _openHandler() {

        if (this.timeout !== 0) {

            clearTimeout(this.timeout);
            this.timeout = 0;

        }
        logger(`info`, `[ws][-- open connection --]`);

    }

    _messageHandler(message) {

        let data = (message.data) ? JSON.parse(message.data) : [];

        if (data.length > 0) event.bus.emit(`app:command`, data);

    }

    _errorHandler() {
        logger(`error`, `[ws][-- error connection --]`);
    }

    _reconnection() {

        this.timeout = setTimeout(() => {

            logger(`error`, `[ws][-- reconnecting ... --]`);
            this.connect();

        }, this.time);

    }

    _close() {

        logger(`error`, `[websockets][close][ -- close connection -- ]`);

        // this.client.removeEventListener('open', this._openHandler.bind(this));
        // this.client.removeEventListener('message', this._messageHandler.bind(this));
        // this.client.removeEventListener('error', this._errorHandler.bind(this));
        // this.client.removeEventListener('close', this._reconnection.bind(this));

        // this.client.close(1000, `dead`);

    }

    sendMessage(object) {

        (this.client !== null)
            ? this.client.send(JSON.stringify(object))
            : logger(`error`, `[websockets][sending][ -- no connection -- ]`);

    }

};


Вроде как ничего сверх сложного нет, но тем не менее. Заранее благодарю.
  • Вопрос задан
  • 504 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Nc_Soft
Если на сервере есть проксирование с nginx на ws, то там может быть параметр
proxy_read_timeout
Умолчание:
proxy_read_timeout 60s;
Контекст: http, server, location
https://nginx.org/ru/docs/http/ngx_http_proxy_modu...
также возможно на сервере есть какой-то ping/pong чекер, а вы его не обрабатываете.
https://github.com/websockets/ws#how-to-detect-and...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы