Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

479
Vistas
Crear una aplicación Wear OS y obtener io.socket.engineio.client.EngineIOException: error de encuesta xhr, aunque ng rok logra que funcione

EDITAR: ¡Para la solución, desplácese hacia abajo hasta el final de esta publicación!

He creado una aplicación de chat Socket IO + node.js que funciona a la perfección con un cliente web. Puedo usar la dirección IP IPv4 externa para acceder al cliente a través de diferentes máquinas en la misma red. Sin embargo, usar socket.io-client-java en mi aplicación Wear OS me está dando problemas. Específicamente, un error de encuesta xhr, cada vez que intento conectarme al servidor.

Me aseguré de que mi servidor se esté ejecutando, he habilitado android:usesCleartextTraffic="true" en AndroidManifest y he intentado cambiar una variedad de opciones para mi socket. He probado varias soluciones de stackoverflow con respecto a este problema, pero desafortunadamente fue en vano.

A continuación se muestra mi código index.js, que es mi servidor.

 const express = require('express'); const app = express(); const http = require('http'); const server = http.createServer(app); const { Server } = require("socket.io"); const io = new Server(server); /** * Initializes app to be a function handler that can supply to * an HTTP server: in this case, index.html is served */ app.get('/', (req, res) => { res.sendFile(__dirname + '/index.html'); }); /** * Initialize a new instance of socket.io by passing * the server object. Listen on the 'connection' event * for incoming sockets and log to the console. */ io.on('connection', (socket) => { console.log('a user connected'); console.log(socket.handshake.query); console.log(socket.handshake.headers); console.log(socket.handshake.auth.token); io.emit('chat message','user connected'); socket.on('disconnect', () => { console.log('user disconnected'); // Let connected users know that a user disconnected io.emit('chat message','user disconnected'); }); }); /** * This will emit the event to all connected sockets. * In this case the event is receiving a chat message. */ io.on('connection', (socket) => { socket.on('chat message', (msg) => { io.emit('chat message', msg); }); }); /** * This tells the server to listen on port 3000 */ server.listen(3000, () => { console.log('listening on *:3000'); });

Estoy creando mi socket de cliente como tal en MainActivity.java:

 private Socket mSocket; { URI uri = URI.create("http://LOCAL_IP_ADDRESS:3000"); IO.Options options = IO.Options.builder() .setUpgrade(false) .build(); mSocket = IO.socket(uri, options); Log.d("mSocket created: ", "true"); }

La dirección IP es correcta ya que puedo acceder al cliente web desde otro dispositivo usando esa URL. Lo extraño es que el cliente de Android funciona cuando se usa una redirección ng rok. Así que sé que es posible, pero no tengo idea de lo que me estoy perdiendo.

Pido disculpas si algo no está claro, he pasado innumerables horas tratando de hacer que esto funcione sin ng rok debido a problemas de latencia, ¡y ahora estoy bastante atascado!

EDITAR: También he podido confirmar que esto solo no funciona en el cliente de Android. Estoy usando la aplicación de chat para comunicarme entre un reloj inteligente Wear OS y un auricular VR habilitado para Android (Pico Neo 3 Pro Eye). Estoy usando un envoltorio de C# para la aplicación VR, y esto puede conectarse usando la URL anterior ( http://LOCAL_IP_ADDRESS:3000 ). Lo único que estoy haciendo diferente es especificar el modo de transporte (que probé en el cliente Wear OS):

 // From my Unity Application which works fine var uri = new Uri("http://192.168.88.140:3000/"); socket = new SocketIOUnity(uri, new SocketIOOptions { Transport = SocketIOClient.Transport.TransportProtocol.WebSocket });

EDICIÓN DE SOLUCIÓN: Entonces, después de pasar literalmente 30-40 horas en este problema, finalmente descubrí qué estaba mal. El reloj que estaba usando, el Moto 360, podía conectarse a Wi-Fi usando su Wi-Fi independiente o mediante la conexión bluetooth a un teléfono Android (es decir, usando la conexión Wi-Fi del teléfono). Después de todo este tiempo, me di cuenta de que la conexión Wi-Fi a través de bluetooth estaba siendo redireccionada y, por lo tanto, no podía conectarme a un servidor implementado localmente.

¡Desconectando el bluetooth en el Moto 360 y obligándolo a conectarse al mismo Wi-Fi que mi servidor, resolvió el error de encuesta XHR!

over 4 years ago · Santiago Trujillo
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda