Socket.io-client: la versión 2.2 no funciona con react native

Creado en 21 dic. 2018  ·  32Comentarios  ·  Fuente: socketio/socket.io-client

Volver a 2.1.1 soluciona el problema.

Sospecho que tiene algo que ver con los nuevos cambios en la administración de cors.
Establecer orígenes manualmente no parece hacer nada.

Mágicamente comienza a funcionar al iniciar el depurador nativo react.

Config

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

Configuración

  • SO: iOS
  • navegador: react-native
  • versión de socket.io: 2.2.0

Comentario más útil

Nada parece funcionar con react native 0.60

Todos 32 comentarios

experimentó el mismo problema en ambas plataformas (simulador) 2.1.1, solo funciona con la activación del depurador.

También me enfrento a este problema. Actualicé para ver si soluciona mi primer problema de latencia de conexión.

Yo también me enfrento a lo mismo. asunto

Volver a 2.1.1 funciona para mí.

Todavía tengo el mismo problema al revertir 2.1.1 que tampoco funciona para mí.

Debe solucionarlo https://github.com/socketio/engine.io-client/pull/607.

@benhjames, ¿ podría confirmar que su solución solucionó el problema en React Native?

Sí, actualmente estoy ejecutando [email protected] (que ha extraído [email protected] ) en React Native sin problemas.

Vale la pena verificar para asegurarse de que su engine.io-client sea ​​3.3.2, ya que contiene la corrección React Native para websockets. 😃

@benhjames @darrachequesne He usado socket. [email protected] (que ha ingresado [email protected]) y también verifica los cambios en node_modules aún, no funciona para mí.

`importar io desde 'socket.io-client';

exportar clase predeterminada HomeScreen extiende React.Component {
constructor (apoyos) {
super (accesorios);
this.socket = io ('ws: //192.168.0.107: 8080 / endpoint', {
reconexión: cierto,
retardo de reconexión: 500,
jsonp: falso,
Intentos de reconexión: Infinito,
transportes: ['websocket']
});
this.socket.on ('connect_error', (err) => {
console.log (err)
});
}
'

Recibo el error de la siguiente manera:
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

Me parece que el punto final es incorrecto: debería ser un enlace de protocolo http o https , no un ws uno. 👍

@benhjames Probé anteriormente con WebSocket API https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API y funcionaba perfectamente bien con el mismo protocolo.

socket.io (a diferencia de la API de WebSocket) solo acepta un URI de protocolo HTTP (S) para el cliente ( consulte los documentos aquí ), pero _utiliza_ el protocolo WS detrás de escena.

Entonces, si haces io('http://192.168.0.107:8080/endpoint', ...) , ¡debería funcionar!

@benhjames gracias por la actualización!

Creo que ws:// debería funcionar correctamente, pero /endpoint significa que desea conectarse al espacio de nombres del punto final (esa es la implementación actual, a partir de v2.x). Es posible que desee utilizar:

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

@darrachequesne He intentado la implementación anterior pero todavía no funciona.

Quizás podría ser útil ver cómo se ve el código del servidor SocketIO, solo para asegurarse de que esté usando el espacio de nombres y la configuración correctos, etc. 🙂

Funciona perfectamente bien con la API de WebSocket, pero cuando intento conectarme con la API de Socket.io, aparece un error como se muestra a continuación:

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 funciona con la API de WebSocket sin una lógica personalizada para anular la serialización de las cargas útiles de socket.io, eso implica que el servidor no está usando socket.io.

¿Existe alguna posibilidad de que pueda proporcionar algún código del servidor para verificar si este es el caso?

@benhjames Así es, estamos usando https://docs.oracle.com/javaee/7/api/javax/websocket/package-summary.html para el código backend.

¡Eso lo explica entonces! Socket.io debe usarse tanto en el cliente como en el servidor para que funcione. 👍

@benhjames @darrachequesne Ahora estoy usando socket.io en el backend, está funcionando bien en el frontend con vanilla javascript usando socket.io pero cuando intento conectar socket.io a través de React Native, aparece el error:

Vanilla JS (Funciona perfectamente bien):

''

¡Consulte la respuesta anterior!

Gracias, @benhjames por su apoyo. Ahora está funcionando. https://github.com/mrniko/netty-socketio/issues/614

Tengo el mismo problema sin importar si elijo websockets o polling. Es un error websocket_error o un error de encuesta xhr.

La URL es una IP (http://192.168.1.112:3000) y me estoy conectando desde un teléfono físico a una computadora en la misma red local usando React Native Expo.

Puedo ayudar si necesita más seguimientos de pila o información ...

socket.io 2.2.0 // tanto cliente como servidor
engine.io 3.3.2 // tanto cliente como servidor

Parece un problema fuera de socket.io, si tanto el websocket como el transporte de sondeo no funcionan. Es posible que desee probar:

  • Conectando al servidor socket.io fuera de React Native, usando el cliente socket.io en un navegador. Si eso tampoco funciona, es probable que haya un problema con el servidor.
  • Realizando una solicitud fetch normal a su servidor. Si eso no funciona, es probable que haya un problema con la red o el entorno React Native.

Voy a probar la primera prueba, la búsqueda normal funciona

EDITAR: parece un problema relacionado con CORS. Si intento conectar un cliente JS simple, obtengo:

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.

¿Algún consejo sobre cómo configurar esto?

probar la última versión de github, así, resolvió mis problemas con RN android:

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

Nada parece funcionar con react native 0.60

La compilación de la versión de Android no funciona cuando se usa RN 0.60.5

Probé las versiones 2.0.4, 2.1.1, 2.2.0 de socket.io-client.

Probado yarn add socketio/engine.io-client#3.3.2

Consulte el n. ° 1305: en Android, debe usar https o establecer el atributo usesCleartextTraffic en AndroidManifest

prueba v2.3

Probé con Expo SDK v34 y v35 (RN 0.59) y tuve que degradar socket.io-client a 1.7.2 ( yarn add [email protected] ) como lo hicieron otras versiones (2.1.1, 2.1.0, 2.2.0) No trabajo. No probé 2.3.0, ahora que funciona no quiero problemas :-)

Hola @lionbur , como sé, hay muchas versiones mini de 0.59. ¿Qué versión está utilizando? 0.59.9?

¡Gracias de antemano!

¿Fue útil esta página
0 / 5 - 0 calificaciones