Saltar al contenido

El uso de Socket.IO en Android siempre devuelve un error de encuesta XHR

Nuestro equipo de expertos pasados muchos días de investigación y recopilar de información, obtuvimos los datos necesarios, queremos que todo este artículo sea de gran utilidad en tu proyecto.

Solución:

Después de más pruebas, encontré lo siguiente:

  1. Si depura su socket cuando encuentra diferentes eventos (es decir, EVENT_ERROR), la excepción que capture contendrá el código de respuesta recibido de la dirección a la que trató de llegar.
  2. En mi caso, cuando intenté llegar a mi servidor con HTTP, recibí un código de respuesta 301 porque la URL a la que intenté acceder me redirigió automáticamente a la dirección HTTPS.
  3. Al intentar llegar a la dirección HTTPS, recibí un código de respuesta 401, lo que significa que la solicitud que hizo mi socket había llegado al servidor pero no estaba autorizada. El motivo fue que el servidor de destino había autenticación básica activada y no proporcioné las credenciales requeridas en los encabezados de solicitud de socket.
  4. Después de proporcionar los encabezados requeridos, logré conectarme al servidor de socket correctamente, pero cuando envié una solicitud falló y mi socket volvió a un bucle de intento de reconexión. La razón de esto fue que el JSON que envié al servidor desde mi teléfono Android no estaba en el formato esperado y el servidor no pudo recibir esa solicitud.

El código que usé para agregar un encabezado de autenticación básico a mi solicitud de socket:

// Adding authentication headers when encountering EVENT_TRANSPORT
mSocket.io().on(Manager.EVENT_TRANSPORT, new Emitter.Listener() 
    @Override
    public void call(Object... args) 
        Transport transport = (Transport) args[0];
        // Adding headers when EVENT_REQUEST_HEADERS is called
        transport.on(Transport.EVENT_REQUEST_HEADERS, new Emitter.Listener() 
            @Override
            public void call(Object... args) 
                Log.v(TAG, "Caught EVENT_REQUEST_HEADERS after EVENT_TRANSPORT, adding headers");
                Map> mHeaders = (Map>)args[0];
                mHeaders.put("Authorization", Arrays.asList("Basic bXl1c2VyOm15cGFzczEyMw=="));
            
        );
    
);

Si encuentra un error de encuesta XHR cuando intenta usar Socket.IO, asegúrese de que la conexión a su servidor de socket esté disponible y que se esté conectando correctamente. Al final, en mi caso, todo giraba en torno a que el servidor requería autenticación básica y yo no la proporcionaba al contactar con el servidor.

Tambiénporque me encontré con esa solución un poco al tratar de resolver este problema – Cuando intenta llegar a su servidor a través de HTTPS, por lo general no necesito un verificador de nombre de host especial o un administrador de certificados especial. Intente evitar tales soluciones, ya que dañan en gran medida la seguridad de su aplicación.

Puedo verificar un problema similar con mi situación. Estoy probando la conexión websocket a un servidor de desarrollo. Sin SSL, simplemente http. Aquí estaba mi situación:

  1. Probé la conexión websocket de las aplicaciones al servidor de desarrollo usando el simulador de estudio de Android: se conectó correctamente y sin errores.
  2. Probado No. (1) anterior con dispositivo real en lugar de simulador. fallado con el "xhr poll error" mensaje.
  3. Luego, después de tanto tiempo sin éxito, agregué AndroidManifest.xml el seguimiento:

Mi proyecto actualmente tiene como objetivo la API 28, por lo tanto, el valor predeterminado para "usesCleartextTraffic" es false. Ahora todo está funcionando bien.

Esto también sucederá si olvidó configurar el transporte en las opciones

IO.Options opts = new IO.Options();
opts.transports = new String[]WebSocket.NAME; //or Polling.NAME 

Si te gusta la programación, tienes el poder dejar un ensayo acerca de qué le añadirías a este artículo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *