socket.io принудительно отключается через XHR-опрос

У меня есть приложение клиент/сервер, использующее nodejs на сервере и socket.io в качестве механизма подключения. По причинам, относящимся к моему приложению, я хочу иметь только одно активное подключение для каждого браузера и отклонять все подключения с других вкладок, которые могут быть открыты позже во время сеанса. Это прекрасно работает с WebSockets, но если WebSockets не поддерживаются браузером и вместо этого используется XHR-опрос, отключение никогда не происходит, поэтому, если пользователь просто обновляет страницу, это не интерпретируется как повторное подключение (у меня есть задержка для переподключение и восстановление сеанса), а как новую вкладку, которая заканчивается отклонением соединения, поскольку старое соединение, созданное этой же вкладкой, все еще активно.

Я ищу способ эффективно завершить соединение с клиентом всякий раз, когда происходит обновление. Я пытался привязаться к beforeunload и вызвать socket.disconnect() на стороне клиента, а также отправить сообщение типа socket.emit('force-disconnect') и вызвать отключение от сервера без успеха. Я что-то упустил здесь? Ценю вашу помощь!

Я прочитал этот вопрос и не смог не нахожу это полезным для моего конкретного случая.


person scanales    schedule 20.08.2012    source источник


Ответы (2)


Решил проблему, оказалось, что это была ошибка, представленная в socket.io 0.9.5. Если у вас возникла эта проблема, просто обновите ОБА серверный и клиентский код до socket.io > 0.9.9 и установите клиентские параметры socket.io с sync disconnect on unload на true, и все готово.

Параметры устанавливаются таким образом:

var socket = io.connect('http://yourdomain.com', {'sync disconnect on unload' : true});
person scanales    schedule 21.08.2012
comment
Я сделал именно это... 1) npm install socket.io 2) npm install socket.io-client 3) var socket = io.connect('yourdomain.com', {'отключение синхронизации при выгрузке' : true}); на стороне клиента. Xhr-опрос нормально работает в браузере Chrome. Но не на моем iPad. - person ngzhongcai; 29.08.2012
comment
Хм, не уверен, почему ipad обрабатывает это по-другому ... вы пытались отключить все другие транспорты, чтобы убедиться, что это происходит исключительно через опрос XHR, поскольку это транспорт, о котором мы говорим здесь? - person scanales; 29.08.2012
comment
Совершенно точно, только xhr-опрос в транспортном варианте - person ngzhongcai; 02.09.2012
comment
Думаю, я подожду объединения engine.io - person ngzhongcai; 02.09.2012
comment
Блестяще - избавил меня от больших неприятностей. Вот вам вполне реальный вопрос: как вы нашли этот вариант? Кажется, я вижу такие вещи только на StackOverflow и остальных. Что вы сделали, чтобы открыть этот флаг? Для других бесстрашных исследователей: погуглив, я нашел эту страницу для параметров конфигурации socket.io. github.com/LearnBoost/socket.io/wiki/Configuring-Socket. ввод-вывод - person EML; 04.04.2013
comment
@EML эта опция находится прямо в указанном вами URL-адресе под заголовком клиента. - person scanales; 16.04.2013
comment
Да, именно поэтому я разместил страницу. Я легко нашел его после того, как вы представили название опции. - person EML; 16.04.2013
comment
Спасибо! это действительно помогло мне .. собираюсь опубликовать это на форумах и прочее :D - person julian; 29.07.2013
comment
@ИзраильГ. Буду признателен за ссылку на этот вопрос! - person scanales; 29.07.2013
comment
@ngzhongcai Подробнее о том, почему отключение синхронизации не работает на iOS, см. в этом ответе: stackoverflow.com/a/18064892/69868 - person Miroslav Bajtoš; 09.08.2013

Вы также можете получить «Ошибка: ошибка опроса xhr», если у вас закончились доступные дескрипторы открытых файлов. Скорее всего, это произойдет во время нагрузочного теста.

Проверьте текущий размер дескриптора открытого файла:

ulimit -n

Увеличьте его до большого числа:

ulimit -n 1000000
person Deniz Ozger    schedule 30.01.2014