Ich sende eine große Datenmenge an den Server. Jetzt, während ich die Daten gesendet habe und auf die Antwort des Servers warte, verliert mein Android-Gerät plötzlich die Internetverbindung.
Früher habe ich einen Warndialog für Verbindungsverlust angezeigt, aber auf der Serverseite wurden die Daten bereits verarbeitet und irgendwo aktualisiert, z. B. auf einer beliebigen URL. Aber mein Android-Handy weiß das nicht, da es nie eine Antwort bekommen hat. Wie man es löst.
Ob es auf dem Server oder auf Android selbst gemacht werden könnte, wie?
Woher weiß der Server, dass das Android-Telefon die Antwort nicht abhört?
Dies kann eine Perspektive zur Optimierung der Client-Server-Kommunikation sein.
server
server-side
client-side
android-development
mayank_droid
quelle
quelle
Antworten:
Dies ist ein recht häufiges Problem bei asynchronen Transaktionen und gliedert sich in mehrere Teile.
Das Tolle an HTTP ist, dass es ziemlich einfach ist, all diese Probleme zu lösen.
Stellen Sie sich eine URL-Struktur wie diese vor:
Verwenden von HTTP-Post zum Senden einer Anforderung an den Server unter Verwendung einer eindeutigen Clientanforderungs-ID. Der Server antwortet dann mit der Job-ID. Wenn diese Antwort aus Client-Sicht nicht auftritt, muss die Anforderung erneut gesendet werden. Aus Sicht des Servers müssen die Client-Anforderungs-IDs einige Minuten zwischengespeichert werden, falls der Client doppelte Anforderungen sendet. Doppelte Anforderungen werden einfach bearbeitet, indem dieselbe Job-ID an den Client zurückgegeben wird.
Der Client erhält die Ergebnisse der Anforderung über die Ergebnis-URL. Dieser Aufruf kann beliebig oft wiederholt werden, um die Ergebnisse zu erhalten. Wenn es aufgerufen wird, bevor die Ergebnisse verfügbar sind, kann die Antwort eine NO-CONTENT-Antwort sein, sodass der Client weiß, dass der Server die Job-ID erkennt, aber noch nicht über den Inhalt verfügt. Wenn die Job-ID nicht erkannt wird, ist NOT-FOUND die geeignete Antwort.
Das Endergebnis ist, dass der Client immer eine sinnvolle Aktion ausführen kann, wenn das Netzwerk verloren geht und wiederhergestellt wird, und ebenso kann der Server Anforderungen vom Client immer sinnvoll verarbeiten
quelle
Dies fällt unter die Grundlagen der Protokollkommunikation. Der Android-Client hat eine Transaktion angefordert, und der Server muss die Transaktion ausführen. Wenn die Transaktion von der Bestätigung des Android-Clients abhängt, ist dies die ACK / NAK-Kommunikation.
ACK (Acknowledgement) und NAK (Negative Acknowledgement) teilen der Gegenseite das Ergebnis einer Anfrage mit.
Sie fragen nach einer Art Handshake- Austausch zwischen Client und Server, der mit einem einfachen ACK / NAK-Austausch durchgeführt werden kann.
Hier ist ein Beispiel dafür, wie Android eine Datei mit bidirektionaler Bestätigung hochlädt.
Im obigen Beispiel habe ich einen
#id
eindeutigen Bezeichner für die Transaktion hinzugefügt . Der Server sollte die Dateien empfangen, einen Transaktionsdatensatz erstellen und diesen als Antwort an Android zurücksenden. Android sollte dann eine Bestätigung dieser Transaktion (oder alternativ eine NAK für eine Ablehnung) folgen.Hier ist ein Beispiel für eine Android-Verbindung, die während des Handshakes getrennt wird.
Im obigen Beispiel hat der Server die hochgeladenen Dateien akzeptiert und eine
#id
ACK-Antwort an Android zurückgesendet, Android antwortet jedoch nie mit einer ACK. Das Android-Gerät konnte den Handshake nicht abschließen. Sie müssen entscheiden, wie der Server damit umgehen soll. Zerstören Sie die Transaktion, behalten Sie die Transaktion bei und warten Sie, bis das Android-Gerät später zurückkehrt, oder schließen Sie die Transaktion trotzdem ab.Der Server kann davon ausgehen, dass das Gerät nicht mit ACK geantwortet hat. Das Android-Gerät hat seinen internen Status nicht aktualisiert, um anzuzeigen, dass der Upload erfolgreich war. Ich würde die Transaktion verwerfen und dem Gerät erlauben, sie in Zukunft zu wiederholen.
quelle