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.
reconnection: true,
reconnectionDelay: 500,
jsonp: false,
reconnectionAttempts: Infinity,
transports: ['websocket']
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):
''
<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.
Puede ser necesario conectarse a una URL que no sea localhost (es decir, la IP de su computadora) dentro de React Native: ciertamente en Android y posiblemente en iOS, dependiendo del simulador que se esté utilizando.
Si eso aún no funciona, entonces vale la pena probar la opción transports: ['polling']
para ver si realmente es el transporte WebSocket en particular el que no funciona, o si se trata de un problema de conexión de red más general.
@benhjames Estoy enfrentando un problema extraño. Estoy usando https://github.com/mrniko/netty-socketio en el backend y si estoy usando Vanilla JS como se mencionó anteriormente, funciona perfectamente bien, pero si estoy usando con react-native, el servidor muestra una conexión exitosa pero en react-native, obtengo un error de conexión de la siguiente manera:
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
...
PD:
Con NodeJS funciona perfectamente bien sin ningún error.
¡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:
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!
Comentario más útil
Nada parece funcionar con react native 0.60