У меня возникли проблемы при попытке установить соединение с веб-сокетом на react-native. Я не уверен, поддерживается эта платформа или нет, однако эта ошибка воспроизводится в обычном приложении node.js. Как ни странно, у меня проблемы только тогда, когда встроенный отладчик response-native отключен . Я тестирую это на iOS 10.2 с react-native v0.43.1
и socket.io-client v1.7.3
. На моем сервере работает socket.io v1.7.2
размещенный на HTTP-порту 1337.
Как только я реализую socket.io-client
в response-native и попытаюсь установить соединение без включенного отладчика, он должен воспроизвести с двумя ошибками в зависимости от параметров. Если я не укажу свой вариант транспорта, ошибка будет XHR: POLLING ERROR
. Если я укажу «websocket» в моей опции транспорта, тогда ошибка станет WEBSOCKET ERROR
. Это все, что я получил.
Регулярное подключение к моему серверу через веб-сокет. Работает с включенным отладчиком.
Единственная другая проблема, связанная с этой, которую я обнаружил, - это №1056, и я удивлен тем, насколько странно связаны эти проблемы. Я повторил сценарий в обычном приложении node.js и испытал аналогичные результаты, однако ошибки были более подробно описаны, как показано ниже.
Без указанной опции транспорта:
{ Error: xhr poll error
at XHR.Transport.onError (/path/to/root/node_modules/engine.io-client/lib/transport.js:64:13)
at Request.<anonymous> (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:129:10)
at Request.Emitter.emit (/path/to/root/node_modules/component-emitter/index.js:133:20)
at Request.onError (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:307:8)
at Timeout._onTimeout (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:254:18)
at ontimeout (timers.js:365:14)
at tryOnTimeout (timers.js:237:5)
at Timer.listOnTimeout (timers.js:207:5) type: 'TransportError', description: 503 }
С transports: ['websocket']
:
{ Error: websocket error
at WS.Transport.onError (/path/to/root/node_modules/engine.io-client/lib/transport.js:64:13)
at WebSocket.ws.onerror (/path/to/root/node_modules/engine.io-client/lib/transports/websocket.js:149:10)
at WebSocket.onError (/path/to/root/node_modules/ws/lib/WebSocket.js:452:14)
at emitOne (events.js:96:13)
at WebSocket.emit (events.js:189:7)
at ClientRequest.onerror (/path/to/root/node_modules/ws/lib/WebSocket.js:711:10)
at emitOne (events.js:96:13)
at ClientRequest.emit (events.js:189:7)
at TLSSocket.socketErrorListener (_http_client.js:358:9)
at emitOne (events.js:96:13)
type: 'TransportError',
description:
{ Error: socket hang up
at TLSSocket.onHangUp (_tls_wrap.js:1117:19)
at Object.onceWrapper (events.js:291:19)
at emitNone (events.js:91:20)
at TLSSocket.emit (events.js:186:7)
at endReadableNT (_stream_readable.js:974:12)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
code: 'ECONNRESET',
type: 'error',
target:
WebSocket {
domain: null,
_events: [Object],
_eventsCount: 4,
_maxListeners: undefined,
_socket: null,
_ultron: null,
_closeReceived: false,
bytesReceived: 0,
readyState: 0,
supports: [Object],
extensions: {},
_binaryType: 'nodebuffer',
_isServer: false,
url: 'wss://SERVER_IP:1337/socket.io/?EIO=3&transport=websocket',
protocolVersion: 13 } } }
Также имейте в виду, что браузер-клиент socket.io работает безупречно, подключаясь к этому конкретному веб-серверу.
Я пробовал разные сети, провайдеры и даже VPN. Я не понимаю на данный момент.
ОБНОВЛЕНИЕ : после окончательного тестирования одного из моих приложений на моем iPhone с помощью socket.io-client мне повезло, что я не столкнулся с ошибкой опроса XHR. Однако я все еще испытываю эту ошибку в обычном приложении узла.
В настоящее время у меня такая же проблема с моим приложением узла. Я использую встроенный сервер socket.io, и, похоже, он отлично работает в браузере, но в приложении узла socket.io-client выдает ту же ошибку опроса 503 xhr, указанную выше. Я запускаю сервер и клиент на одном компьютере, но подключение к петлевому или локальному сетевому адресу из клиентского приложения не работает. Я использую версию 1.7.3
как socket.io
и socket.io-client
.
Я также вижу эту ошибку в версии 2.0.1
(клиент и сервер) при запуске с узла.
Я решил свою проблему неделю назад путем рефакторинга, но не помню, что именно решило проблему. Извините за это, у меня была загруженная неделя, и это была первая фиксация.
Вы можете попробовать установить opts.transports
только на websocket
в клиенте:
io.connect(url, { transports: ['websocket'] }); // default is ['polling', 'websocket']
У меня была слишком сложная логика привязки сокетов и действий, прежде чем я реорганизовал код. Поэтому убедитесь, что логика сокета в вашем коде работает, и упростите отладку.
Я попробую наш транспорт. На данный момент я понизил версию до 1.7.4, и, похоже, все работает.
Да, я уменьшил версию с 2.0.1 до 1.7.4, исправил это
Итак, я вернулся к 2.0.1
и настроил свой клиент на использование только транспорта websocket. Это (почти) работает:
io(`localhost:8080`, {
transports: [ 'websocket' ],
upgrade: false
});
Теперь моя единственная проблема заключается в том, что транспорт веб-сокетов не работает для областей действия веб-воркеров. Я думаю, что обнаружил проблему и открыл соответствующую проблему на engine.io-client
здесь https://github.com/socketio/engine.io-client/issues/569
Выдается ли какая-нибудь ошибка? Не могли бы вы запустить с включенной отладкой? ( DEBUG=engine*
)
Что касается response-native, это может быть связано с https://github.com/socketio/socket.io-client/issues/1114.
@darrachequesne Итак, я только что вернулся к транспорту по умолчанию в клиентском компоненте на стороне сервера. Моя ошибка там ... Транспорт для голосования определенно у меня работает. Проблема, с которой я столкнулся, заключалась в моих самоподписанных сертификатах ssl для местного разработчика. Мне пришлось добавить rejectUnauthorized: process.env.NODE_ENV === 'production'
в конфигурацию socket.io, чтобы он заработал. В противном случае я получал 503
.
Однако проблема веб-воркеров реальна. socketio / engine.io-client # 569
попробуй это
require('socket.io-client')('http://localhost', {
rejectUnauthorized: false,
})
Спасибо попробую
----- Исходное сообщение -----
От: Zetsin [email protected]
Получатель: "socketio / socket.io-client" [email protected]
Копия: Wangzhiqiang [email protected] , комментарий [email protected]
Тема: Re: [socketio / socket.io-client] Ошибка опроса XHR появляется при наличии отладчика (# 1097)
Дата: 16:22, 20 мая 2017 г.
попробуй это
require ('socket.io-client') ('http: // localhost', {
rejectUnauthorized: ложь,
})
-
Вы получили это, потому что прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите обсуждение.
У меня такая же проблема. Затем я меняю свой клиентский код на
require('socket.io-client')('wss://myserver:port/ws', { transports: ['websocket'], rejectUnauthorized: false });
Но теперь я получаю ответ об ошибке 404. Журнал показывает, что к моему URL-адресу запроса добавлен дополнительный /socket.io/
.
{ Error: unexpected server response (404)
at ClientRequest._req.on (/Users/chris/Projects/nationsky/mgmt-server/backend/node_modules/ws/lib/WebSocket.js:650:26)
at emitOne (events.js:115:13)
at ClientRequest.emit (events.js:210:7)
at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:564:21)
at HTTPParser.parserOnHeadersComplete (_http_common.js:116:23)
at TLSSocket.socketOnData (_http_client.js:453:20)
at emitOne (events.js:115:13)
at TLSSocket.emit (events.js:210:7)
at addChunk (_stream_readable.js:252:12)
at readableAddChunk (_stream_readable.js:239:11)
type: 'error',
target:
WebSocket {
domain: null,
_events: [Object],
_eventsCount: 4,
_maxListeners: undefined,
readyState: 0,
bytesReceived: 0,
extensions: {},
protocol: '',
_binaryType: 'arraybuffer',
_finalize: [Function: bound finalize],
_finalizeCalled: false,
_closeMessage: null,
_closeTimer: null,
_closeCode: null,
_receiver: null,
_sender: null,
_socket: null,
_ultron: null,
protocolVersion: 13,
_isServer: false,
url: 'wss://myserver:port/socket.io/?access_token=HnbtDUEWu1i1HVrAn-DO9YOL6GZxoittWAf8Sz_RR0s&EIO=3&transport=websocket',
_req: [Object] } } }
Для меня это появляется, даже если отладчика нет
Привет! У меня была такая же проблема, когда я пытался подключиться из приложения Node.js к серверу, вот мой код:
const socket = require('socket.io-client')('https://domain.com')
Журнал, который я получил при запуске DEBUG=engine* npm run dev
был примерно таким:
engine.io-client:socket creating transport "polling" +2s
engine.io-client:polling polling +1ms
engine.io-client:polling-xhr xhr poll +0ms
engine.io-client:polling-xhr xhr open GET: https://domain.com/socket.io/?EIO=3&transport=polling&t=LzBM71r&b64=1 +0ms
engine.io-client:polling-xhr xhr data null +0ms
engine.io-client:socket setting transport polling +1ms
engine.io-client:socket socket error {"type":"TransportError","description":503} +7ms
engine.io-client:socket socket close with reason: "transport error" +0ms
engine.io-client:polling transport not open - deferring close +0ms
Когда я попытался подключиться из браузера к https://domain.com/socket.io/socket.io.js
это сработало, и я тоже использовал io('https://domain.com')
, поэтому я выполнил инструкции в комментариях и изменил свой код на:
const socket = require('socket.io-client')('https://domain.com', { rejectUnauthorized: false })
И это сработало, но это странно, у меня есть действующие сертификаты от Let's Encrypt , или это нормально? в любом случае ... я добавил параметр transports
(тоже из комментариев), чтобы избежать других подключений, кроме websocket
и в конце код был:
const socket = require('socket.io-client')('https://domain.com', {
transports: ['websocket'],
rejectUnauthorized: false
})
Спасибо @ibrahimduran и @SupremeTechnopriest : smile:
Приношу свои извинения, если я писал как Тарзан: sweat_smile: я работаю над своим английским, ха-ха
У меня была эта проблема, и я потратил на это 2 часа, оказалось, что это просто правильное указание ваших параметров. Вот как их следует указать:
let socketClient = socketIOClient.connect(`http://localhost:3001`,{ // [1] Important as fuck
reconnectionDelay: 1000,
reconnection:true,
reconnectionAttempts: 10,
transports: ['websocket'],
agent: false, // [2] Please don't set this to true
upgrade: false,
rejectUnauthorized: false
});
[1] Если вы не укажете, использовать http или https, по умолчанию будет https. Или, если вы не указываете порт сразу после URL-адреса как «url. Com: port », по умолчанию используется значение 80 или 443 в зависимости от протокола. Я видел несколько ответов stackoverflow, в которых порт указан в качестве параметра в объекте параметров. Я заглянул в код, но такой возможности нет. Вам необходимо указать порт в URL-адресе.
[2] Кроме того, я установил для агента значение true, и ему не удалось установить соединение ws, и ошибки не было, просто истекло время ожидания. Только не указывайте агента вообще. По умолчанию - false.
@ teja42 Я 2 дня пытался исправить эту проблему. Я думал, что это проблема с пакетом webpack, но ваше решение отлично сработало. Спасибо!
Привет !
У меня была та же проблема, и я исправил понижение с 2.0.1 до 1.7.4, как сказал @SupremeTechnopriest, и все работает нормально!
Благодарность !
Привет, у меня все еще проблема с Android 8.1 :(
Псевдокод:
`` ''
this.socket = io.connect ('https: // xxxxxxxxxxxxxx', {
путь: '/ socketchannel',
RenectionDelay: 1000,
переподключение: правда,
переподключениеПопыток: 10,
транспорты: ['websocket'],
агент: ложь,
обновление: ложь,
rejectUnauthorized: false
});
this.socket.on ('подключиться', () => {
console.log ('сокет подключен!')
})
this.socket.on ('connect_error', (err) => {
console.log ('ошибка подключения сокета ->' + err);
})
`` ''
Приложение переходит в событие 'connection_error' и регистрирует «Ошибка: ошибка веб-сокета».
"react-native": "0.57.4",
"socket.io-client": "1.7.4"
Какие-либо предложения?
Приложение переходит в событие 'connection_error' и регистрирует «Ошибка: ошибка веб-сокета».
Столкнувшись с той же проблемой
"react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz",
"engine.io-client": "~3.3.2",
"socket.io-client": "2.1.1",
Я столкнулся с той же проблемой, есть ли обновления?
+1 за это
У меня была эта проблема из-за origins
сервера сокетов.
Итак, как добавить происхождение?
Всем привет. Итак, я использую кластер PM2 для своего экспресс-сервера node и использую адаптер redis:
const redis = require('socket.io-redis')
io.adapter(redis(config.redis))
Для браузерных клиентов это нормально, но для socket.io-client я получаю:
{ Error: xhr post error
at XHR.Transport.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transport.js:67:13)
at Request.<anonymous> (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:111:10)
at Request.Emitter.emit (/home/user/Desktop/nodeclienttest/node_modules/component-emitter/index.js:133:20)
at Request.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:311:8)
at Timeout._onTimeout (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:258:18)
at listOnTimeout (timers.js:327:15)
at processTimers (timers.js:271:5) type: 'TransportError', description: 400 }
{ Error: xhr poll error
at XHR.Transport.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transport.js:67:13)
at Request.<anonymous> (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:130:10)
at Request.Emitter.emit (/home/user/Desktop/nodeclienttest/node_modules/component-emitter/index.js:133:20)
at Request.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:311:8)
at Timeout._onTimeout (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:258:18)
at listOnTimeout (timers.js:327:15)
at processTimers (timers.js:271:5) type: 'TransportError', description: 400 }
Если я изменю клиентский код для использования транспорта через веб-сокеты, все будет работать нормально.
var socket = require("socket.io-client")("http://localhost:8080", { transports: ['websocket'] });
Проблема в том, что я не хочу требовать изменения этого кода для всего клиентского кода.
Я рекомендую изменить socket.io-client, чтобы попытаться использовать транспорт websocket, если транспорт опроса xhr не работает. Что вы думаете?
попробуйте последнюю версию с github, вот так, решила мои проблемы с RN android:
npm i socketio/engine.io-client#3.3.2 -S
Ваше здоровье
Я знаю, что это решение будет звучать немного странно, но я попал сюда, погуглил эту ошибку.
В моем случае я получал это, потому что мой сервер не работал (я думал, что это так). Надеюсь, что это поможет кому-то другому :)
попробуй это
require('socket.io-client')('http://localhost', { rejectUnauthorized: false, })
Спасибо, у меня возникли проблемы с подключением к моему серверу из приложения узла, и это решение сработало для меня.
попробуй это
require('socket.io-client')('http://localhost', { rejectUnauthorized: false, })
Спасибо, у меня возникли проблемы с подключением к моему серверу из приложения узла, и это решение сработало для меня.
Здравствуйте, мне просто интересно, какую версию socket.io и socket.io-client вы используете
попробуй это
require('socket.io-client')('http://localhost', { rejectUnauthorized: false, })
Спасибо, у меня возникли проблемы с подключением к моему серверу из приложения узла, и это решение сработало для меня.
Здравствуйте, мне просто интересно, какую версию socket.io и socket.io-client вы используете
Я использую и socket.io, и socket.io-client версии 2.3.0.
Привет, у меня все еще проблема с Android 8.1 :(
Псевдокод:
this.socket = io.connect('https://xxxxxxxxxxxxxx', { path: '/socketchannel', reconnectionDelay: 1000, reconnection:true, reconnectionAttempts: 10, transports: ['websocket'], agent: false, upgrade: false, rejectUnauthorized: false }); this.socket.on('connect', () => { console.log('socket connected!') }) this.socket.on('connect_error', (err) => { console.log('socket connected error --> ' + err); })
Приложение переходит в событие 'connection_error' и регистрирует «Ошибка: ошибка веб-сокета».
"react-native": "0.57.4",
"socket.io-client": "1.7.4"Какие-либо предложения?
Та же проблема. Вы ее решаете?
Я решаю свою проблему, используя доменное имя.
Самый полезный комментарий
Я решил свою проблему неделю назад путем рефакторинга, но не помню, что именно решило проблему. Извините за это, у меня была загруженная неделя, и это была первая фиксация.
Вы можете попробовать установить
opts.transports
только наwebsocket
в клиенте:У меня была слишком сложная логика привязки сокетов и действий, прежде чем я реорганизовал код. Поэтому убедитесь, что логика сокета в вашем коде работает, и упростите отладку.