socket.io проблемы с опросом, постоянное подключение/отключение

Итак, это часть более крупного приложения, которое я пытался запустить с помощью кластера и socket.io-redis, чтобы оно работало на нескольких узлах и машинах, если мне понадобится масштабирование в будущем.

Кажется, у меня серьезные проблемы с некоторыми клиентами, которые не могут поддерживать соединения. Некоторые клиенты делают это настойчиво (в основном устройства iOS, которые, как я полагаю, должны использовать транспорт опроса), но другие иногда работают, а иногда нет (что опять же я приписываю использованию опроса).

Я удалил все обратно, и оказалось, что проблема была не в кластере.

В любом случае мой server.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

var port = process.env.PORT || 3800;

/* -------------------------------- */

io.on('connection', function(socket){
    var datetime = new Date().toLocaleString();
    console.log(datetime+' - '+'a user connected - '+socket.id);
});

/* -------------------------------- */


http.listen(port, function() {
    var datetime = new Date().toLocaleString();
    console.log(datetime+' - '+'listening on *:' + port);
});

и вывод в консоль

Wed Mar 11 2015 16:22:53 GMT+0000 (GMT) - listening on *:3800
Wed Mar 11 2015 16:22:54 GMT+0000 (GMT) - a user connected - YrLUOrgfpnQVwoWMAAAA
Wed Mar 11 2015 16:22:58 GMT+0000 (GMT) - a user connected - nH6x-97uf3iR2LgNAAAB
Wed Mar 11 2015 16:23:01 GMT+0000 (GMT) - a user connected - VsrFO31elPyKfQJcAAAC
Wed Mar 11 2015 16:23:08 GMT+0000 (GMT) - a user connected - 7xuKZ6aykYIDcxN-AAAD
Wed Mar 11 2015 16:23:15 GMT+0000 (GMT) - a user connected - ZsmZtFHmLrH1DxXWAAAE
Wed Mar 11 2015 16:23:22 GMT+0000 (GMT) - a user connected - HFUApMwwFZallJnQAAAF

Это просто продолжается бесконечно. Я тестирую его с iPad, при этом клиент загружается из сверхзвукового приложения appgyver (cordova и javascript).

Я получаю ту же проблему при использовании форка примера чата socket.io, модифицированного для использования в кластере - https://github.com/evilstudios/chat-example-cluster

Мой вопрос: почему некоторые клиенты не могут поддерживать соединение? Как исправить эти проблемы, когда опросный транспорт не поддерживает ни одного сеанса?


person Horse    schedule 11.03.2015    source источник
comment
Я бы посоветовал вам посмотреть на трассировку сети на стороне сервера и посмотреть, что на самом деле происходит. Вы хотите знать, запрашивает ли клиент подключение к веб-сокету, а затем теряет его, или клиент и сервер не соглашаются перейти на веб-сокет. Все соединения через веб-сокет начинаются с http-запроса, а затем обе стороны должны согласиться перейти на постоянное соединение с веб-сокетом.   -  person jfriend00    schedule 11.03.2015
comment
но, конечно, если он вернется к опросу, он все равно должен работать? например, подключить и сохранить один и тот же идентификатор сеанса для каждого опроса   -  person Horse    schedule 12.03.2015
comment
Первое, что нужно сделать, это (как я сказал в своем предыдущем комментарии) выяснить, что на самом деле происходит в сети, а затем исходить из этого. Вы можете предположить, что сеанс следует поддерживать, но пока вы не узнаете, что на самом деле происходит в сети, вы действительно не знаете, на что смотреть дальше.   -  person jfriend00    schedule 13.03.2015
comment
@Horse Ты смог решить проблему? Я столкнулся с той же проблемой без помощи!   -  person Raptor    schedule 25.07.2017
comment
@Raptor это было давно, но я смутно помню, как обновил (или понизил) версию, и она просто исчезла. Также iirc не нравилось, когда сервер выдавал существующие соединения. Надеюсь, это поможет, для потомков, дайте нам знать :)   -  person Horse    schedule 28.07.2017
comment
@Horse, спасибо за ответ! Мне также удалось исправить это, обновив до последней версии! :)   -  person Raptor    schedule 28.07.2017


Ответы (2)


Это может быть связано с однопоточной архитектурой node.js.

Проверьте ответ здесь: https://stackoverflow.com/a/51524799/996926

person advncd    schedule 18.02.2019

вы должны обновить свои передние и задние пакеты socket.io, иначе у вас будут сбои в способе транспортировки сокета, передняя часть будет использовать опрос, и, следовательно, у вас будет массовое отключение сокетов....

Решение: обновите версии ваших пакетов socket.io спереди и сзади.

person Canonne Gregory    schedule 21.11.2020