it-swarm.com.de

Bei Verwendung von Socket.IO unter Android wird immer ein XHR-Abruffehler ausgegeben

Ich schreibe eine Android-App, die eine Verbindung zu einer Socket.IO-Instanz herstellen muss, die auf einem node.js-Server ausgeführt wird.

Der Versuch, eine Verbindung zur Instanz herzustellen und Daten mit einem iOS-Gerät zu übertragen, funktioniert einwandfrei, aber wenn ich versuche, dies mit einem Android-Gerät zu tun, schlägt der Versuch fehl.

Ich verwende den Native Java-Client und dies ist der Code, den ich auf der Android-Seite verwende:

mManager = new Manager(new URI("https://example.com"));
mSocket = mManager.socket("/users");

// socket events listeners
    mSocket.on(Socket.EVENT_CONNECTING, new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.v(TAG, "Caught EVENT_CONNECTING");
            for (Object obj : args) {
                Log.v(TAG, "Errors :: " + obj);
            }
        }
    }).on(Socket.EVENT_CONNECT, new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.v(TAG, "connected to the backend");
            Log.v(TAG, String.format("JSON Obj to emit: %s", jsonObject.toString()));
            mSocket.emit("hello_packet", jsonObject);
        }
    }).on(Socket.EVENT_RECONNECTING, new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.v(TAG, "Caught EVENT_RECONNECTING");
            for (Object obj : args) {
                Log.v(TAG, "Errors :: " + obj);
            }
        }
    }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.v(TAG, "Socket disconnected");
        }
    }).on(Socket.EVENT_ERROR, new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.v(TAG, "Caught EVENT_ERROR");
            for (Object obj : args) {
                Log.v(TAG, "Errors :: " + obj);
            }
        }
    }).on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.v(TAG, "Caught EVENT_CONNECT_ERROR");
            for (Object obj : args) {
                Log.v(TAG, "Errors :: " + obj);
            }
        }
    });

    Log.v(TAG, "Connecting socket");
    mSocket.connect();

Immer wenn ich versuche, eine Verbindung herzustellen (Im Grunde sobald die Zeile mSocket.connect();) Das Protokoll gibt die folgenden Zeilen aus:

05-07 22:41:36.684 15552-15552/com.my.app V/Main Activity: Connecting socket
05-07 22:41:36.699 15552-15858/com.my.app V/Main Activity: Caught EVENT_CONNECTING
05-07 22:41:36.926 15552-15866/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:41:36.926 15552-15866/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:41:38.189 15552-15884/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:41:38.189 15552-15884/com.my.app V/Main Activity: Errors :: 1
05-07 22:41:38.207 15552-15887/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:41:38.208 15552-15887/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:41:39.518 15552-15911/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:41:39.518 15552-15911/com.my.app V/Main Activity: Errors :: 2
05-07 22:41:39.531 15552-15915/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:41:39.531 15552-15915/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:41:41.846 15552-15949/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:41:41.846 15552-15949/com.my.app V/Main Activity: Errors :: 3
05-07 22:41:41.857 15552-15953/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:41:41.857 15552-15953/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:41:46.863 15552-16025/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:41:46.864 15552-16025/com.my.app V/Main Activity: Errors :: 4
05-07 22:41:46.879 15552-16029/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:41:46.879 15552-16029/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:41:51.883 15552-16126/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:41:51.883 15552-16126/com.my.app V/Main Activity: Errors :: 5
05-07 22:41:51.895 15552-16130/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:41:51.895 15552-16130/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:41:56.900 15552-16236/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:41:56.900 15552-16236/com.my.app V/Main Activity: Errors :: 6
05-07 22:41:56.921 15552-16240/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:41:56.921 15552-16240/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:42:01.927 15552-16357/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:42:01.927 15552-16357/com.my.app V/Main Activity: Errors :: 7
05-07 22:42:01.945 15552-16361/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:42:01.945 15552-16361/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:42:06.951 15552-16466/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:42:06.952 15552-16466/com.my.app V/Main Activity: Errors :: 8
05-07 22:42:06.969 15552-16470/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:42:06.970 15552-16470/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:42:11.975 15552-16545/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:42:11.976 15552-16545/com.my.app V/Main Activity: Errors :: 9
05-07 22:42:11.994 15552-16549/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:42:11.994 15552-16549/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:42:17.000 15552-16629/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:42:17.000 15552-16629/com.my.app V/Main Activity: Errors :: 10
05-07 22:42:17.012 15552-16633/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:42:17.012 15552-16633/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:42:22.017 15552-16710/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:42:22.017 15552-16710/com.my.app V/Main Activity: Errors :: 11
05-07 22:42:22.033 15552-16714/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:42:22.033 15552-16714/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:42:27.039 15552-16788/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:42:27.039 15552-16788/com.my.app V/Main Activity: Errors :: 12
05-07 22:42:27.056 15552-16792/com.my.app V/Main Activity: Caught EVENT_CONNECT_ERROR
05-07 22:42:27.056 15552-16792/com.my.app V/Main Activity: Errors :: io.socket.engineio.client.EngineIOException: xhr poll error
05-07 22:42:32.061 15552-16957/com.my.app V/Main Activity: Caught EVENT_RECONNECTING
05-07 22:42:32.062 15552-16957/com.my.app V/Main Activity: Errors :: 13

Ich bekomme also sofort nach dem Verbindungsversuch einen xhr-Abruffehler und alle folgenden Verbindungsversuche erzielen dasselbe Ergebnis.

Ich habe einige Beiträge gesehen, die besagten, dass ein solches Problem durch ein SSL-Zertifikat verursacht werden könnte, obwohl alle Versuche, die ich mit dem SSL-Kontext gemacht hatte, die Socket.IO-Bibliothek verwendet, nicht funktionierten.

Wenn anyoen eine Idee hat, was ich vielleicht versuchen könnte, damit dies funktioniert, wäre das hervorragend.

Wenn Informationen oder Code-Beispiele fehlen, lass es mich wissen und ich füge sie hinzu.

11
Mor Paz

Nach weiteren Tests habe ich folgendes gefunden:

  1. Wenn Sie Ihr Socket debuggen, wenn Sie auf andere Ereignisse stoßen (d. H. EVENT_ERROR), enthält die von Ihnen erfasste Ausnahme den Antwortcode, den Sie von der Adresse erhalten haben, die Sie erreichen wollten.
  2. In meinem Fall habe ich beim Versuch, meinen Server über HTTP zu erreichen, einen 301-Antwortcode erhalten, da die URL, die ich anstrebte, automatisch an die HTTPS-Adresse umgeleitet wurde.
  3. Beim Versuch, die HTTPS-Adresse zu erreichen, erhielt ich einen 401-Antwortcode. Dies bedeutet, dass die Anforderung, die mein Socket gemacht hat, den Server erreicht hat, aber nicht autorisiert war. Der Grund dafür war, dass der Zielserver basic authentication and hatte Ich habe die erforderlichen Anmeldeinformationen nicht in den Socket-Anforderungsheadern angegeben.
  4. Nachdem ich die erforderlichen Header bereitgestellt hatte, konnte ich mich ordnungsgemäß mit dem Socket-Server verbinden. Beim Senden einer Anforderung schlug der Socket jedoch erneut in eine Wiederholungsversuchsschleife zurück. Der Grund dafür war, dass der JSON, den ich an den Server gesendet habe Mein Android-Telefon hatte nicht das erwartete Format und der Server konnte diese Anfrage nicht erhalten.

Der Code, den ich zum Hinzufügen eines Basis-Authentifizierungsheaders zu meiner Socket-Anforderung verwendet habe

// 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<String, List<String>> mHeaders = (Map<String, List<String>>)args[0];
                mHeaders.put("Authorization", Arrays.asList("Basic bXl1c2VyOm15cGFzczEyMw=="));
            }
        });
    }
});

Wenn beim Versuch, Socket.IO zu verwenden, ein Fehler beim XHR-Abruf auftritt, stellen Sie sicher, dass die Verbindung zu Ihrem Socket-Server verfügbar ist und dass Sie eine ordnungsgemäße Verbindung herstellen. In meinem Fall drehte sich alles um den Server, der eine Basisauthentifizierung erfordert, und ich habe ihn nicht angegeben, wenn ich mit dem Server Kontakt aufnehme.

Auch , weil ich beim Versuch, dieses Problem zu lösen, ein wenig auf diese Lösung gestoßen ist. - Wenn Sie versuchen, Ihren Server über HTTPS zu erreichen, benötigen Sie normalerweise keinen speziellen Hostnamen-Verifizierer oder -Sonder Zertifikatsmanager. Versuchen und vermeiden Sie solche Lösungen, da diese die Sicherheit Ihrer App stark beeinträchtigen.

6
Mor Paz

Dies passiert auch, wenn Sie vergessen haben, die Transportoptionen einzustellen

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

ich habe Ihren Code verwendet und hatte genau die gleiche Ausgabe, aber Ihre Lösung löste das für mich nicht. Die Lösung, die ich fand, bestand darin, alle X Sekunden Daten auszugeben. Die Verbindung wurde abgebrochen, wenn keine Daten gesendet wurden.

Ich musste keine Autorisierung machen.

Der Code ist genau wie der EVENT_TRANSPORT-Teil und der EVENT_CONNECT lautet wie folgt:

socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                Log.d("mylogs", "Socket: Web socket opened");

                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {

                        socket.emit("YOUR_TOPIC", "YOUR_DATA_VALUE");

                        handler.postDelayed(this, 1000);
                    }
                };
                handler.post(runnable);

            }
        })

Ich wollte es nur hier lassen, es könnte jemandem in der Zukunft helfen, ob Sie es glauben oder nicht, dies war eine unangenehme Lösung, der "xhr-Umfragefehler" ist sehr vage und es können viele verschiedene Dinge dazu führen. Nachdem so viele verschiedene Dinge ausprobiert wurden, konnte dieser einfache Code es lösen.

0
Ricardo Abreu