Возврат к 2.1.1 устраняет проблему.
Я подозреваю, что это как-то связано с новыми изменениями в руководстве Cors.
Ручная установка происхождения, похоже, ничего не дает.
Он волшебным образом начинает работать при запуске отладчика react native.
reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']
возникла та же проблема на обеих платформах (симуляторе) 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 (работает отлично):
`` ''
<script>
var socket = io.connect('http://localhost:9092');
socket.on('connect', function() {
output('<span class="connect-msg">Client has connected to the server!</span>');
});
**React Native code: (Not working)**
this.socket = io.connect('http://localhost:9092',{
reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']});
this.socket.on('connect',function(e){
console.log("on Connect");
})
this.socket.on('connect_error', (err) => {
console.log(err)
});
**Error:**
17:15
websocket error
Stack trace:
node_modules/engine.io-client/lib/transport.js:67:22 in onError
node_modules/engine.io-client/lib/transports/websocket.js:157:17 in onerror
node_modules/event-target-shim/lib/event-target.js:172:43 in dispatchEvent
node_modules/react-native/Libraries/WebSocket/WebSocket.js:290:10 in
node_modules/react-native/Libraries/vendor/emitter/EventEmitter.js:191:12 in emit
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:349:47 in __callFunction
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:106:26 in
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:297:10 in __guard
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:105:17 in callFunctionReturnFlushedQueue
```
I am using https://github.com/mrniko/netty-socketio in backend.
Может потребоваться подключиться к URL-адресу, отличному от localhost (то есть IP-адресу вашего компьютера) в React Native: обязательно в Android и, возможно, в iOS, в зависимости от того, какой симулятор используется.
Если это по-прежнему не работает, стоит попробовать опцию transports: ['polling']
чтобы увидеть, действительно ли это транспорт WebSocket, который не работает, или это более общая проблема с сетевым подключением.
@benhjames У меня странная проблема. Я использую https://github.com/mrniko/netty-socketio в бэкэнде, и если я использую Vanilla JS, как упоминалось выше, он работает отлично, но если я использую с response-native, сервер показывает успешное соединение, но в response-native, я получаю сообщение об ошибке подключения, как показано ниже:
server error
Stack trace:
node_modules/engine.io-client/lib/socket.js:453:28 in onPacket
node_modules/engine.io-client/lib/socket.js:276:18 in <unknown>
node_modules/component-emitter/index.js:133:25 in emit
node_modules/engine.io-client/lib/transport.js:148:12 in onPacket
node_modules/engine.io-client/lib/transports/polling.js:144:18 in callback
node_modules/engine.io-parser/lib/browser.js:384:20 in decodePayload
node_modules/engine.io-client/lib/transports/polling.js:148:23 in onData
node_modules/engine.io-client/lib/transports/polling-xhr.js:127:16 in <unknown>
node_modules/component-emitter/index.js:133:25 in emit
node_modules/engine.io-client/lib/transports/polling-xhr.js:300:12 in onData
node_modules/engine.io-client/lib/transports/polling-xhr.js:367:16 in onLoad
node_modules/engine.io-client/lib/transports/polling-xhr.js:253:10 in onreadystatechange
node_modules/event-target-shim/lib/event-target.js:172:43 in dispatchEvent
node_modules/react-native/Libraries/Network/XMLHttpRequest.js:570:23 in setReadyState
node_modules/react-native/Libraries/Network/XMLHttpRequest.js:392:25 in __didCompleteResponse
node_modules/react-native/Libraries/vendor/emitter/EventEmitter.js:191:12 in emit
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:349:47 in __callFunction
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:106:26 in <unknown>
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:297:10 in __guard
node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:105:17 in callFunctionReturnFlushedQueue
...
PS:
С NodeJS он работает отлично, без ошибок.
См. Ответ выше!
Спасибо, @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, если и веб-сокет, и транспорт опроса не работают. Вы можете попробовать:
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?
Заранее спасибо!
Самый полезный комментарий
Кажется, ничего не работает с react native 0.60