Socket.io-client: версия 2.2 не работает с React Native

Созданный на 21 дек. 2018  ·  32Комментарии  ·  Источник: socketio/socket.io-client

Возврат к 2.1.1 устраняет проблему.

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

Он волшебным образом начинает работать при запуске отладчика react native.

Конфиг

reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']

Настраивать

  • ОС: iOS
  • браузер: реагировать-родной
  • версия socket.io: 2.2.0

Самый полезный комментарий

Кажется, ничего не работает с react native 0.60

Все 32 Комментарий

возникла та же проблема на обеих платформах (симуляторе) 2.1.1, работает только при включении отладчика.

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

Я тоже сталкиваюсь с тем же. проблема

Возврат на 2.1.1 у меня работает.

Я все еще сталкиваюсь с той же проблемой, что и 2.1.1 тоже не работает для меня.

Это должно быть исправлено https://github.com/socketio/engine.io-client/pull/607.

@benhjames, не могли бы вы подтвердить, что ваше исправление

Да, в настоящее время я использую [email protected] (который вытащил [email protected] ) на React Native без проблем.

Стоит убедиться, что ваш engine.io-client равен 3.3.2, поскольку он содержит исправление React Native для веб-сокетов. 😃

@benhjames @darrachequesne Я использовал сокет. [email protected] (который вытащил [email protected]), а также проверьте изменения в node_modules, у меня это не работает.

`импортировать io из 'socket.io-client';

экспорт класса по умолчанию HomeScreen расширяет React.Component {
конструктор (реквизит) {
супер (реквизит);
this.socket = io ('ws: //192.168.0.107: 8080 / конечная точка', {
переподключение: правда,
RenectionDelay: 500,
jsonp: ложь,
повторное подключениеПопытки: Бесконечность,
транспорт: ['websocket']
});
this.socket.on ('connect_error', (err) => {
console.log (ошибка)
});
}
`

Я получаю сообщение об ошибке, как показано ниже:
Error: websocket error at WS.Transport.onError (transport.js:67) at WebSocket.ws.onerror (websocket.js:157) at WebSocket.dispatchEvent (event-target.js:172) at WebSocket.js:289 at RCTDeviceEventEmitter.emit (EventEmitter.js:190) at MessageQueue.__callFunction (MessageQueue.js:349) at MessageQueue.js:106 at MessageQueue.__guard (MessageQueue.js:297) at MessageQueue.callFunctionReturnFlushedQueue (MessageQueue.js:105) at debuggerWorker.js:72

Мне кажется, что конечная точка неверна - это должна быть ссылка на протокол http или https , а не ws one. 👍

@benhjames Я ранее пробовал использовать WebSocket API https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API, и он отлично работал с тем же протоколом.

socket.io (в отличие от WebSocket API) принимает только URI протокола HTTP (S) для клиента ( см. документацию здесь ), но за кулисами _использует_ протокол WS.

Так что если вы сделаете io('http://192.168.0.107:8080/endpoint', ...) это должно сработать!

@benhjames спасибо за обновление!

Я думаю, что ws:// должно работать правильно, но /endpoint означает, что вы хотите подключиться к пространству имен конечной точки (это текущая реализация, начиная с версии v2.x). Вы можете использовать:

this.socket = io('ws://192.168.0.107:8080', {
  path: '/endpoint',
  reconnection: true,
  reconnectionDelay: 500,
  jsonp: false,
  reconnectionAttempts: Infinity,
  transports: ['websocket']
});

@darrachequesne Я пробовал вышеуказанную реализацию, но она все еще не работает.

Возможно, будет полезно посмотреть, как выглядит код сервера SocketIO, просто чтобы убедиться, что он использует правильное пространство имен, настройки и т. Д. 🙂

Он отлично работает с WebSocket API, но когда я пытаюсь подключиться к Socket.io API, я получаю сообщение об ошибке, как показано ниже:

websocket error

Stack trace:
  null:null in WS.Transport.onError
  node_modules/engine.io-client/lib/transports/websocket.js:178:8 in WebSocket.ws.onerror
  node_modules/event-target-shim/lib/event-target.js:172:38 in WebSocket.dispatchEvent
  node_modules/react-native/Libraries/WebSocket/WebSocket.js:289:13 in <unknown>
  node_modules/react-native/Libraries/vendor/emitter/EventEmitter.js:190:32 in RCTDeviceEventEmitter.emit
  node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:349:41 in MessageQueue.__callFunction
  node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:106:11 in <unknown>
  node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:297:8 in MessageQueue.__guard
  node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:105:9 in MessageQueue.callFunctionReturnFlushedQueue
  http://192.168.0.103:19001/debugger-ui/debuggerWorker.js:72:58 in <unknown>

Если он работает с API WebSocket без специальной логики для десериализации полезной нагрузки socket.io, это означает, что сервер не использует socket.io.

Есть ли шанс предоставить какой-нибудь код с сервера, чтобы проверить, так ли это?

@benhjames Правильно, мы используем https://docs.oracle.com/javaee/7/api/javax/websocket/package-summary.html для внутреннего кода.

Тогда это все объясняет! Socket.io необходимо использовать как на клиенте, так и на сервере. 👍

@benhjames @darrachequesne Теперь я использую socket.io в бэкэнде, он отлично работает в интерфейсе с ванильным javascript с помощью socket.io, но когда я пытаюсь подключить socket.io через React Native, я получаю сообщение об ошибке:

Vanilla JS (работает отлично):

`` ''

См. Ответ выше!

Спасибо, @benhjames за вашу поддержку, теперь он работает. https://github.com/mrniko/netty-socketio/issues/614

У меня одна и та же проблема, независимо от того, выбрал ли я веб-сокеты или опрос. Это либо ошибка websocket_error, либо ошибка опроса xhr.

URL-адрес - это IP-адрес (http://192.168.1.112:3000), и я подключаюсь с физического телефона к компьютеру в той же локальной сети с помощью React Native Expo.

Я могу помочь, если вам нужно больше трассировок стека или информации ...

socket.io 2.2.0 // и клиент, и сервер
engine.io 3.3.2 // и клиент, и сервер

Похоже на проблему за пределами socket.io, если и веб-сокет, и транспорт опроса не работают. Вы можете попробовать:

  • Подключение к серверу socket.io вне React Native с помощью клиента socket.io в браузере. Если и это не сработает, вероятно, проблема с сервером.
  • Выполнение обычного запроса fetch к вашему серверу. Если это не сработает, вероятно, проблема связана с сетью или средой React Native.

Собираюсь попробовать первый тест, нормальная загрузка работает

РЕДАКТИРОВАТЬ: похоже, проблема, связанная с CORS. Если я попытаюсь подключить простой JS-клиент, я получу:

Access to XMLHttpRequest at 'http://192.168.1.112:3000/socket.io/?EIO=3&transport=polling&t=MfV8vhI' from origin 'http://192.168.1.112:5000' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

Любые советы о том, как это настроить?

попробуйте последнюю версию с github, вот так, решила мои проблемы с RN android:

npm i socketio/engine.io-client#3.3.2 -S

Кажется, ничего не работает с react native 0.60

Сборка релиза Android не работает при использовании RN 0.60.5

Пробовал socket.io-client версий 2.0.4, 2.1.1, 2.2.0.

Пробовал yarn add socketio/engine.io-client#3.3.2

См. №1305 - на Android необходимо использовать https или установить атрибут usesCleartextTraffic в AndroidManifest.

попробуйте v2.3

Я пробовал использовать Expo SDK v34 и v35 (RN 0.59), и мне пришлось понизить версию socket.io-client до 1.7.2 ( yarn add [email protected] ), как это делали другие версии (2.1.1, 2.1.0, 2.2.0). Не работает. 2.3.0 не пробовал, теперь, когда работает, не хочу проблем :-)

Привет @lionbur , насколько я знаю, существует множество мини-версий 0.59. Какую версию вы используете? 0,59,9?

Заранее спасибо!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги