Я установил socket.io v.1.4.5 w express, и мне не удалось отследить причину необъяснимых отключений на клиентах. Причина, указанная событием отключения на клиенте, - «закрытие транспорта». С некоторыми клиентами это происходит постоянно.
Есть ли какое-нибудь объяснение того, что клиент получает отключение "закрытие транспорта" за то, что кажется временным интервалом? Клиент повторно подключается нормально, но это вызывает крайние неудобства, потому что это происходит очень часто.
Я пробовал различные настройки, такие как изменение pingInterval, pingTimeout и порта для веб-сокетов (теперь я использую порт 80). Но что бы я ни делал, проблема никогда не исчезнет.
Обновлено до socket.io v2.0.3. и все еще есть проблема. Это происходит только на одном из моих компьютеров. Я также отключил брандмауэр Windows, но проблема все еще возникает.
Перешел на ws (https://github.com/websockets/ws), который включал в себя массовые перезаписи, но теперь я использую собственный объект браузера websocket на стороне клиента, и все работает отлично. У меня больше нет проблемы. Прощай, socket.io!
Испытывает то же самое. Я действительно не хочу переписывать. У кого-нибудь есть успех с этой проблемой?
Я действительно устал от этой проблемы.
Я думаю, вам стоит проверить версию socket.io с помощью socket.io-client.
если версия сервера / клиента не совпадает, соединение было очень нестабильным.
Я рекомендую просто использовать CDN для клиента, как показано ниже.
@ref: https://cdnjs.com/libraries/socket.io
I hope it helps.
Разработчик Feudal Wars ?? Это здорово.
У меня тоже есть эта проблема.
Пользователь был отключен случайным образом из-за закрытия транспорта и тайм-аута проверки связи.
Я также пытался изменить многие параметры (интервал ping, тайм-аут ping, передача ...), но это не сработало.
Я проверил версию сервера и клиента socket.io
Многие люди страдают от этой проблемы, но я не могу найти решения.
Любые новости по этой проблеме, потому что у меня точно такая же проблема!
У меня такая же проблема при развертывании на k8ns, но когда я запускаю локально, все работает нормально.
Я тоже страдаю от этого ...
@ talas9 @muhammadnasr @htamop общие вопросы, чтобы иметь возможность отлаживать / воспроизводить проблему:
Спасибо!
Я пробовал это с клиентом и сервером 2.1.0 и 2.0.4. На хроме и сафари (последняя версия).
Когда я запускаю локально, он работает нормально (можно подключать более часа без отключения), но когда я развертываю K8ns за входным балансировщиком нагрузки, эта проблема возникает ...
К вашему сведению, соединение закрывается ровно через 25 секунд каждый раз, см. Снимок экрана
@ talas9 @htamop @ dnwldbs84 вы используете балансировщик нагрузки?
@darrachequesne Какие балансировщики нагрузки вы рекомендуете использовать с socket.io?
@muhammadnasr @darrachequesne
Я использовал сервер 2.1.0 и клиент 1.0.0 (android)
Мне нужно поддерживать стабильное соединение в течение 8–9 часов, но оно неожиданно отключается.
Поменял обе версии на 1.7.4 и 0.8.3? согласно другому сообщению решения. Я попробую завтра проверить, работает ли он хорошо
Я не использовал балансировщик нагрузки. И клиент, и сервер использовали версию Socket.io 2.0.3 (я не могу вспомнить все версии, которые я использовал). Я не знаю, какой браузер вызывает проблему. Однако большинство пользователей использовали Chrome. В моем случае отключение было случайным, поэтому его невозможно воспроизвести.
И я перешел на ws. Я не уверен, что проблема решена.
@muhammadnasr @darrachequesne @ dnwldbs84
Думаю, в моем случае это решено.
Я использую 0.8.3 socket.io-client в службе переднего плана Android (api 26) и версию 1.3.5 на сервере nodejs.
Однако проблема может быть не в версии.
Я изменил pingInterval на сервере на 10 мс, и, похоже, он работает правильно (тайм-аут ping и закрытие транспорта не произошло)
var io = require ('socket.io') (http, {pingInterval: 10, pingTimeout: 4000});
10 миллисекунд - это слишком мало, поэтому сеть будет перегружена.
10 миллисекунд - это сужение, тогда сеть будет перегружена.
Верный!
@muhammadnasr любой балансировщик нагрузки должен работать. См. Следующие примеры:
Однако липкий сеанс необходим, если вы включили опрос (по умолчанию).
@darrachequesne У меня такая же проблема, примерно через 8 ~ 9 часов сокет отключается по причине "транспортного закрытия"
Я использую:
Chrome: 61.0.3163.100
Electron: 2.0.2
Socket.io: 2.1.1
Имел ту же проблему, смог исправить ее с помощью CDN из этого комментария https://github.com/socketio/socket.io/issues/3025#issuecomment -329024833 и установив тайм-аут и интервал, как показано ниже:
io.set('heartbeat timeout', 60000);
io.set('heartbeat interval', 25000);
Привет,
У нас такая же проблема с socket.io, когда он работает под Kubernetes и NGINX Ingress Controller.
Когда конфигурация nginx перезагружается, он воссоздает процесс, и все существующие коммуникации отбрасываются, что вызвало transport close
, любые другие развертывания, использующие входной контроллер, могут вызвать перезагрузку конфигурации.
Прежде всего, большое спасибо за этот потрясающий проект.
Та же проблема, может, я принесу тебе что-нибудь новенькое.
У меня есть сервер WS и клиент WS на узле js.
Этот клиент ws используется из приложения node js, где находится служба (микросервис).
Другие клиенты ws из веб-браузеров (из клиентских приложений) обмениваются данными через сервер ws с этой службой js узла.
Все работает как положено.
На стресс-тестах сейчас (10 клиентов интенсивно запрашивают данные), по окончании тестов, когда все задания и транзакции завершены, соединение сервиса закрывается с ошибкой «закрытие транспорта». Так бывает не всегда.
Это конфиг сервера:
pingTimeout: 15000,
pingInterval: 20000,
Похоже, что при большой нагрузке пропадают какие-то пинги ...? или я не знаю.
Это то, чего я должен ожидать?
Кроме того, с конфигурацией по умолчанию pingTimeout: 2000 я получал эту ошибку в середине стресс-теста. Это тоже было совершенно неожиданно, но предположим, что сервер был перегружен и не мог ответить в течение 2 секунд (!), И мы могли бы получить эту ошибку. А вот с pingTimeout: 15000 бывает почти на 50% и только после окончания тестов.
Хмхо, я считаю, что микросервисы должны ожидать такого рода ошибок, даже если они работают на одной и той же локальной сети, но вопрос в том, почему это происходит?
Я попытался создать небольшую установку, чтобы воспроизвести эту проблему, но не смог.
Как активировать логи? DEBUG = socket.io * не работает. Хотя переменная установлена, я не получаю никаких результатов.
Я твердо уверен, что это связано с № 2924.
Повторное подключение на клиенте вызвано тем, что некоторые браузеры (Safari и Chrome) регулируют таймеры для неактивных вкладок для экономии заряда батареи.
Это приводит к отложенным контрольным сообщениям от клиента и сервера, закрывающего соединение из-за pingTimeout.
Увеличение pingTimeout в некоторой степени работает, но я все еще получаю переподключения в производственной среде.
У меня такая же проблема при развертывании на k8ns, но когда я запускаю локально, все работает нормально.
@muhammadnasr, где вы можете решить проблему с развертыванием на K8s? У меня похожие проблемы.
@ bheema01 просто убедитесь, что у вас включена липкая сессия на вашем прокси / балансировщике нагрузки, и она должна работать
Получил такую же ошибку
Та же проблема ... клиенты постоянно подключаются и отключаются, когда конечная точка сокета на стороне сервера находится за балансировщиком нагрузки. Даже после настройки липких сеансов проблема все еще существует. @muhammadnasr удалось решить проблему.
Я видел эту ошибку, когда поток часто блокировался более 200 мс.
Если это происходит часто, это плохо для socket.io _ и вашего приложения также_.
У socket.io есть тайм-аут для проверки пульса соединения.
Если этот таймаут превышен, соединение отключается, и мы получаем эту ошибку.
@varunSabnis после исправления липкой сессии все
@dennisat Я попытался проверить, сколько времени потребовалось моему клиенту, чтобы получить пакет с понгом. Каждый раз он превышал 200 мс, что было проверено как с сервером сокетов в облаке, так и с сервером сокетов на моем локальном хосте. Локальная настройка не отключает сокет (все работает нормально), тогда как в облачной настройке сокет постоянно подключается и отключается. Так что я не думаю, что это проблема.
@muhammadnasr хорошо, это здорово. Фактически включили его, но все еще есть некоторые проблемы.
@muhammadnasr @darrachequesne @ dnwldbs84
Думаю, в моем случае это решено.
Я использую 0.8.3 socket.io-client в службе переднего плана Android (api 26) и версию 1.3.5 на сервере nodejs.
Однако проблема может быть не в версии.
Я изменил pingInterval на сервере на 10 мс, и, похоже, он работает правильно (тайм-аут ping и закрытие транспорта не произошло)
var io = require ('socket.io') (http, {pingInterval: 10, pingTimeout: 4000});
Работает волшебно, спасибо !!!!!!!
Я обнаружил, что транспорт закрывается каждый интервал проверки связи.
Я действительно устал от этой проблемы.
Я думаю, вам стоит проверить версию socket.io с помощью socket.io-client.
если версия сервера / клиента не совпадает, соединение было очень нестабильным.Я рекомендую просто использовать CDN для клиента, как показано ниже.
@ref: https://cdnjs.com/libraries/socket.io
I hope it helps.
It works even more magically.
Seems that we can close this issue with your answer, haha
Наконец, я понял, что это из-за несовпадения версий клиента и сервера.
Теперь все работает нормально, когда я делаю клиент и сервер одной и той же версией socket.io.
Я думаю, что логика пинг-понга может отличаться в разных версиях socket.io, и сервер не получил событие ping со стороны клиента в интервале ping, который дает сообщение «транспорт закрывается».
Я столкнулся с проблемой отключения socket.io каждые 30 секунд после развертывания на Google Cloud Platform (GCP). Оказалось, что это тайм-аут http по умолчанию, используемый Global Load Balancer. В документации GCP сказано, что вы должны изменить значение при использовании веб-сокетов. Инструкции по изменению настройки находятся здесь:
https://cloud.google.com/load-balancing/docs/backend-service#timeout -setting
все еще сталкивается с той же проблемой на "socket.io": "2.2.0",
"socket.io-client": "2.2.0",
socket.io- client: закрытие
То же самое. На локальном сервере никогда не возникает проблем. Но при развертывании за балансировщиком нагрузки он случайным образом имеет тайм-аут ping. Вероятно, 1 из 50 раз. Я попытался использовать версию CDN и добавить липкий сеанс. Проблема все еще существует.
У меня ничего не работало, кроме какой-то настраиваемой логики переподключения. Если клиент получает событие открытия сокета с идентификатором, отличным от предыдущего, отправьте серверу событие повторного подключения со старым и новым идентификаторами. Затем на сервере просто обновите идентификатор сокета игрока и повторно отправьте состояние игры.
@tmusaev не могли бы вы опубликовать эту настраиваемую логику переподключения для клиента?
У меня такая же проблема: "транспорт рядом"
такая же проблема. наконец я разрешаю это. Nginx - мой прокси-сервер, но proxy_read_timeout
config составляет 60 секунд, это означает, что если клиент или сервер не отправит никаких сообщений в течение 60 секунд, nginx отключится, поэтому мы можем получить этот transport close
errorMsg.
решение:
proxy_read_timeout
до 600 или болееsetInterval
для отправки сообщения во Front-end"react": "16.8.3",
"react-native": "^0.59.9",
"socket.io": "^2.2.0"
Я использовал эту библиотеку для общения и получения событий. Он отлично работает в iOS, но создает проблему в Android. Он потерял соединение с сокетом в любое время и повторно подключился. Он постоянно показывает одно и то же поведение. а также дать этому транспортному закрытию или ошибку тайм-аута ping
"react": "16.8.3", "react-native": "^0.59.9", "socket.io": "^2.2.0"
Я использовал эту библиотеку для общения и получения событий. Он отлично работает в iOS, но создает проблему в Android. Он потерял соединение с сокетом в любое время и повторно подключился. Он постоянно показывает одно и то же поведение. а также дать этому транспортному закрытию или ошибку тайм-аута ping
+1
В нашем случае проблема вызвана прокси-сервером CDN. Я решил эту проблему, подключив socket.io к исходному сайту, который не был проксирован CDN.
Мы решили эту проблему, обновив контроллер входящего трафика nginx!
Прочитав несколько комментариев к разным темам, я испробовал почти все предложения, сделанные для смягчения этой проблемы с закрытием транспорта . Несмотря на версии, которые я использую на клиенте / сервере (в настоящее время 2.0.3), я получаю такое поведение после развертывания микросервисов с помощью Kubernetes.
На данный момент сервер имеет следующую конфигурацию:
Как уже упоминалось, всякий раз, когда я запускаю приложение локально, отключение не происходит. Я читал в другом потоке, что версия 3 для socket.io изменит пинг / понг, поэтому это сделано для сервера, и это может помочь исправить это. Есть ли у кого-нибудь новости или обновления по этой проблеме или возможной дате выхода этой новой версии?
Я видел эту ошибку, когда поток часто блокировался более 200 мс.
Если это происходит часто, это плохо для socket.io _ и вашего приложения также_.
У socket.io есть тайм-аут для проверки пульса соединения.
Если этот таймаут превышен, соединение отключается, и мы получаем эту ошибку.
Тем, кто использует Socket.IO для отправки больших объемов данных, убедитесь, что это делается так, чтобы не блокировать поток. Я столкнулся с этим сегодня, используя клиент сокета в React Native, и я использую его для отправки файлов на сервер. Из-за того, как мы написали отправку файлов через сокет, которая по сути является универсальной, а не последовательной, поток JS задыхается и не может отправить понг обратно на сервер, отключив его, дав нам это ошибка.
У меня такая же проблема с моим приложением, я не думаю, что это проблема с пинг-понгом. Я сомневаюсь, что это должно быть причиной проблемы на стороне сервера, которая закрыла транспорт сокета.
Та же проблема. В браузере Angular.
Эта конфигурация значительно сократила количество переподключений:
Я использовал forceJSONP из-за корса
После своего анализа я обнаружил следующую проблему
ПРОБЛЕМА:
Сокеты работают нормально без каких-либо отключений локально, но при развертывании в среде сокеты отключаются с "закрытием транспорта" в качестве причины отключения.
Я видел эту проблему только при запуске приложения узла с помощью службы выскочки или службы systemmd. Если мы запустим приложение, такое как node app.js, я НЕ вижу этой проблемы.
ПРОСТОЕ ИСПРАВЛЕНИЕ / РЕШЕНИЕ:
На стороне клиента, при отключении сокета, socket emit добавляет пользователя (angular 11)
self.socket.on('disconnect', (reason) => {
if(currentUser){
self.socket.emit('add user', currentUser);
}
})
В приведенном выше сценарии все пользователи всегда подключены и находятся в сети, будут отключены при выходе из системы.
Самый полезный комментарий
Я столкнулся с проблемой отключения socket.io каждые 30 секунд после развертывания на Google Cloud Platform (GCP). Оказалось, что это тайм-аут http по умолчанию, используемый Global Load Balancer. В документации GCP сказано, что вы должны изменить значение при использовании веб-сокетов. Инструкции по изменению настройки находятся здесь:
https://cloud.google.com/load-balancing/docs/backend-service#timeout -setting