Socket.io-client: la version 2.2 ne fonctionne pas avec React Native

Créé le 21 déc. 2018  ·  32Commentaires  ·  Source: socketio/socket.io-client

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.

Configuration

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

Installer

  • Système d'exploitation : iOS
  • navigateur : reactive-native
  • version socket.io : 2.2.0

Commentaire le plus utile

Rien ne semble fonctionner avec le natif de réaction 0.60

Tous les 32 commentaires

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) :

```

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 :

  • Connexion au serveur socket.io en dehors de React Native, à l'aide du client socket.io dans un navigateur. Si cela ne fonctionne pas non plus, il y a probablement un problème avec le serveur.
  • Faire une requête 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!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

zappfinger picture zappfinger  ·  5Commentaires

ledmago picture ledmago  ·  3Commentaires

gtk2k picture gtk2k  ·  3Commentaires

Sairyss picture Sairyss  ·  4Commentaires

vadimka123 picture vadimka123  ·  6Commentaires