Socket.io не отключается через Cloudflare / Nginx

Любой набор переменных также может быть завершен в классе. Переменные «Variable» могут быть добавлены к экземпляру класса во время выполнения, напрямую обращаясь к встроенному словарю через атрибут __dict__.

Следующий код определяет класс Variables, который добавляет переменные (в этом случае атрибуты) к своему экземпляру во время построения. Имена переменных берутся из указанного списка (который, например, мог быть сгенерирован программным кодом):

# some list of variable names
L = ['a', 'b', 'c']

class Variables:
    def __init__(self, L):
        for item in L:
            self.__dict__[item] = 100

v = Variables(L)
print(v.a, v.b, v.c)
#will produce 100 100 100
0
задан Kognise 24 March 2019 в 15:56
поделиться

2 ответа

Вы должны добавить заголовки обновления к своему сокету io path в конфигурации nginx следующим образом:

    location ~* \.io {
      .. your configuration

      proxy_pass http://localhost:3000;
      proxy_redirect off;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }

Поскольку вы попросили расширение ответа, первое, что вы, возможно, уже знаете is socket.io - это протокол, который использует протокол Websockets под капотом (поэтому оба они одинаковы). В качестве стандартов и протоколы Websockets, и протоколы HTTP прослушивают один и тот же порт 80 или 443. Протокол по умолчанию - HTTP, если пользователь хочет использовать протокол websockets, он / она должен отправить запрос на обновление с HTTP на протокол WS, и есть какой-то ключ аутентификация и шаги.

Вот почему вам нужно поместить их в конфигурацию nginx.

Обратитесь к этому , если вам нужна дополнительная информация о механизме обновления протокола.

Хотя, на мой взгляд, это не является точной копией этого вопроса, я чувствую себя обязанным отдать должное @Paulo за предоставление идеального ответа, даже если он не принят .

0
ответ дан JKK 24 March 2019 в 15:56
поделиться

То, что, вероятно, происходит, это две вещи.

1-й: Socket.io имеет длительный тайм-аут (отсюда несколько секунд) и пытается восстановить соединение, прежде чем объявить, что он был отключен. Проверьте событие reconnect_attempt или reconnecting (обратите внимание, что я некоторое время не использовал socket.io, поэтому я могу ошибиться в выборе времени для этого)

2-й: вы не говорите socket.io, что он отключается после закрытия окна браузера.

Я бы порекомендовал добавить слушатель событий в ваш javascript, который сообщит вашему серверу, что он отключается при закрытии окна.

    window.addEventListener('beforeunload', () => {
       socket.disconnect();
    }
0
ответ дан Jeff 24 March 2019 в 15:56
поделиться
Другие вопросы по тегам:

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