Wenn Socket.IO auf Android verwendet wird, wird immer XHR-Abfragefehler zurückgegeben

9

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 mit der Instanz herzustellen und Daten mit einem iOS-Gerät zu übertragen, funktioniert einwandfrei, aber wenn ich es mit einem Android-Gerät versuche, schlägt es fehl.

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

%Vor%

Immer wenn ich versuche eine Verbindung herzustellen (grundsätzlich sobald die Zeile mSocket.connect(); ) Das Protokoll druckt folgende Zeilen:

%Vor%

So bekomme ich sofort nach dem Verbindungsversuch einen xhr-Poll-Fehler und alle folgenden Verbindungsversuche treffen auf dasselbe Ergebnis.

Ich habe einige Posts gesehen, die besagen, dass ein solches Problem durch ein SSL-Zertifikat-Problem verursacht wurde, obwohl alle Versuche, die ich unternommen habe, um den SSL-Kontext der Socket.IO-Bibliothek zu mildern, nicht funktionierten.

Wenn anyoen eine Idee hat, was ich in der Lage sein könnte, dies zu erreichen, wäre es ausgezeichnet.

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

    
Mor Paz 07.05.2016, 20:12
quelle

2 Antworten

5

Nach weiteren Tests habe ich folgendes gefunden:

  1. Wenn Sie Ihren Socket bei verschiedenen Ereignissen (d. h. EVENT_ERROR) debuggen, enthält die Ausnahme, die Sie fangen, den Antwortcode, der von der Adresse erhalten wurde, die Sie erreichen wollten.
  2. In meinem Fall habe ich beim Versuch, meinen Server mit HTTP zu erreichen, einen Antwortcode 301 erhalten, weil die URL, die ich versucht habe, automatisch an die HTTPS-Adresse weitergeleitet wurde.
  3. Beim Versuch, die HTTPS-Adresse zu erreichen, habe ich einen 401-Antwortcode erhalten - was bedeutet, dass die Anfrage meines Sockets den Server erreicht hat, aber nicht autorisiert wurde. Der Grund dafür war, dass auf dem Zielserver die Standardauthentifizierung aktiviert war / strong> und ich habe die erforderlichen Anmeldeinformationen nicht in den Headeranforderungsheadern angegeben.
  4. Nachdem ich die benötigten Header bereitgestellt hatte, konnte ich mich richtig mit dem Socket-Server verbinden, aber beim Senden einer Anfrage scheiterte es und mein Socket ging zurück in eine Re-Connection-Versuchsschleife - Der Grund dafür war der JSON, an den ich gesendet habe Der Server von meinem Android-Telefon war nicht im erwarteten Format und der Server konnte diese Anforderung nicht empfangen.

Der Code, den ich verwendet habe, um meiner Socket-Anfrage einen Basis-Authentifizierungs-Header hinzuzufügen:

%Vor%

Wenn beim Versuch, Socket.IO zu verwenden, ein XHR-Poll-Fehler auftritt, stellen Sie sicher, dass die Verbindung zu Ihrem Socket-Server verfügbar ist und dass Sie eine ordnungsgemäße Verbindung herstellen. Am Ende drehte sich alles um den Server, der eine Standardauthentifizierung erforderte, und ich versorgte ihn nicht, wenn ich den Server kontaktierte.

Auch , weil ich beim Lösen dieses Problems auf diese Lösung gestoßen bin - Wenn Sie versuchen, Ihren Server über HTTPS zu erreichen, brauchen Sie normalerweise keine a spezieller Hostname-Verifier oder spezieller Zertifikatsmanager. Versuche und vermeide solche Lösungen, da sie die Sicherheit deiner App stark beeinträchtigen.

    
Mor Paz 20.05.2016, 12:57
quelle
0

Ich habe Ihren Code verwendet und hatte genau die gleiche Ausgabe, aber Ihre Auflösung hat es nicht für mich gelöst. Die Lösung, die ich gefunden habe, war Daten alle X Sekunden zu emittieren, im Grunde die Verbindung fallengelassen, wenn keine Daten gesendet wurden.

Ich musste keine Autorisierung machen.

Der Code ist genau wie über dem EVENT_TRANSPORT-Teil und das EVENT_CONNECT ist wie folgt:

%Vor%

Ich wollte das hier einfach lassen, es könnte jemandem in der Zukunft helfen, ob du es glaubst oder nicht, das war ein unangenehmer Fehler, der "xhr-Umfragefehler" ist sehr vage und viele verschiedene Dinge können dazu führen es. Nachdem ich so viele verschiedene Dinge versucht hatte, löste dieser einfache Code es.

    
Ricardo Abreu 13.12.2017 13:05
quelle