Revenir à 2.1.1 résout le problème.
Je soupçonne que cela a quelque chose à voir avec les nouveaux changements de gestion des cors.
La définition manuelle des origines ne semble rien faire.
Il commence à fonctionner comme par magie lors du lancement du débogueur natif de réaction.
reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']
rencontré le même problème sur les deux plates-formes (simulateur) 2.1.1, cela ne fonctionne qu'avec l'activation du débogueur.
Je suis également confronté à ce problème. J'ai mis à niveau pour voir si cela résout mon premier problème de latence de connexion.
Je suis également confronté au même. problème
Revenir à 2.1.1 fonctionne pour moi.
Je suis toujours confronté au même problème en revenant à 2.1.1 qui ne fonctionne pas non plus pour moi.
Il devrait être corrigé par https://github.com/socketio/engine.io-client/pull/607.
@benhjames pouvez-vous confirmer que votre correctif a résolu le problème dans React Native ?
Oui, j'exécute actuellement [email protected]
(qui a attiré [email protected]
) sur React Native sans problème.
Il vaut la peine de vérifier que votre engine.io-client
est bien 3.3.2, car il contient le correctif React Native pour les websockets. ??
@benhjames @darrachequesne J'ai utilisé socket. [email protected] (qui a extrait [email protected]) et vérifiez également les modifications apportées à node_modules, cela ne fonctionne pas pour moi.
`importer io depuis 'socket.io-client' ;
exporter la classe par défaut HomeScreen étend React.Component {
constructeur (accessoires){
super(accessoires);
this.socket = io('ws://192.168.0.107:8080/endpoint',{
reconnexion : vrai,
Délai de reconnexion : 500,
jsonp : faux,
Tentatives de reconnexion : infini,
transporte : ['websocket']
});
this.socket.on('connect_error', (err) => {
console.log(err)
});
}
`
J'obtiens l'erreur comme ci-dessous :
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
Il me semble que le point de terminaison est incorrect - il devrait s'agir d'un lien de protocole http
ou https
, pas un ws
. ??
@benhjames J'ai déjà essayé avec l'API WebSocket https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API et cela fonctionnait parfaitement avec le même protocole.
socket.io (contrairement à l'API WebSocket) n'accepte qu'un URI de protocole HTTP(S) pour le client ( voir la documentation ici ), mais il utilise le protocole WS en coulisse.
Donc si vous faites io('http://192.168.0.107:8080/endpoint', ...)
ça devrait marcher !
@benhjames merci pour la mise à jour !
Je pense que le ws://
devrait fonctionner correctement, mais le /endpoint
signifie que vous souhaitez vous connecter à l'espace de noms du point de terminaison (c'est l'implémentation actuelle, à partir de la v2.x). Vous pouvez utiliser :
this.socket = io('ws://192.168.0.107:8080', {
path: '/endpoint',
reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']
});
@darrachequesne J'ai essayé l'implémentation ci-dessus mais cela ne fonctionne toujours pas.
Peut-être qu'il pourrait être utile de voir à quoi ressemble le code du serveur SocketIO, juste pour s'assurer qu'il utilise le bon espace de noms et les bons paramètres, etc. 🙂
Cela fonctionne parfaitement avec l'API WebSocket, mais lorsque j'essaie de me connecter à l'API Socket.io, j'obtiens une erreur comme ci-dessous :
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>
Si cela fonctionne avec l'API WebSocket sans logique personnalisée pour désérialiser les charges utiles socket.io, cela implique que le serveur n'utilise pas socket.io.
Y a-t-il une chance que vous puissiez fournir du code du serveur pour vérifier si c'est le cas ?
@benhjames C'est vrai, nous utilisons https://docs.oracle.com/javaee/7/api/javax/websocket/package-summary.html pour le code backend.
Ça explique ça alors ! Socket.io doit être utilisé sur _à la fois_ le client et le serveur pour fonctionner. ??
@benhjames @darrachequesne Maintenant, j'utilise socket.io dans le backend, cela fonctionne bien sur le frontend avec vanilla javascript en utilisant socket.io mais lorsque j'essaie de connecter socket.io via React Native, j'obtiens l'erreur :
Vanilla JS (fonctionne parfaitement bien) :
```
<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.
Il peut être nécessaire de se connecter à une URL non-localhost (c'est-à-dire l'IP de votre ordinateur) dans React Native : certainement sous Android et éventuellement sous iOS selon le simulateur utilisé.
Si cela ne fonctionne toujours pas, cela vaut la peine d'essayer l'option transports: ['polling']
pour voir si c'est vraiment le transport WebSocket en particulier qui ne fonctionne pas, ou s'il s'agit d'un problème de connexion réseau plus général.
@benhjames Je suis confronté à un problème étrange. J'utilise https://github.com/mrniko/netty-socketio dans le backend et si j'utilise Vanilla JS comme mentionné ci-dessus, cela fonctionne parfaitement, mais si j'utilise avec react-native, le serveur affiche une connexion réussie mais en react-native, j'obtiens une erreur de connexion comme ci-dessous :
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 :
Avec NodeJS, cela fonctionne parfaitement sans aucune erreur.
S'il vous plaît voir la réponse ci-dessus!
Merci @benhjames pour votre soutien, ça marche maintenant. https://github.com/mrniko/netty-socketio/issues/614
J'ai le même problème, peu importe si j'ai choisi les Websockets ou les sondages. C'est soit une erreur websocket_error, soit une erreur d'interrogation xhr.
L'URL est une adresse IP (http://192.168.1.112:3000) et je me connecte depuis un téléphone physique à un ordinateur sur le même réseau local à l'aide de React Native Expo.
Je peux vous aider si vous avez besoin de plus de traces de pile ou d'informations...
socket.io 2.2.0 // client et serveur
engine.io 3.3.2 // à la fois client et serveur
Cela ressemble à un problème en dehors de socket.io, si le websocket et le transport d'interrogation ne fonctionnent pas. Vous pouvez essayer :
fetch
normale à votre serveur. Si cela ne fonctionne pas, il y a probablement un problème avec le réseau ou l'environnement React Native.Je vais essayer le premier test, la récupération normale fonctionne
EDIT : cela ressemble à un problème lié à CORS. Si j'essaye de connecter un simple client JS, j'obtiens :
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.
Des conseils sur la façon de configurer cela?
essayez la dernière version de github, comme celle-ci, a résolu mes problèmes avec RN android :
npm i socketio/engine.io-client#3.3.2 -S
Rien ne semble fonctionner avec le natif de réaction 0.60
La version Android ne fonctionne pas lors de l'utilisation de RN 0.60.5
J'ai essayé les versions socket.io-client 2.0.4, 2.1.1, 2.2.0.
Essayé yarn add socketio/engine.io-client#3.3.2
Voir #1305 - sur Android, vous devez utiliser https ou définir l'attribut usesCleartextTraffic dans AndroidManifest
essayez la v2.3
J'ai essayé avec Expo SDK v34 et v35 (RN 0.59) et j'ai dû rétrograder socket.io-client à 1.7.2 ( yarn add [email protected]
) comme l'ont fait les autres versions (2.1.1, 2.1.0, 2.2.0) PAS travailler. Je n'ai pas essayé la 2.3.0, maintenant que cela fonctionne, je ne veux pas de problèmes :-)
Salut @lionbur , comme je le sais, il existe de nombreuses mini versions de 0.59. Quelle version utilisez-vous? 0,59.9 ?
Merci d'avance!
Commentaire le plus utile
Rien ne semble fonctionner avec le natif de réaction 0.60