Wie behalte ich HttpClient Connection Keep-Alive?

8

Ich arbeite HttpClient POST-Methode. Ich muss HttpClient einmal erstellen und sollte Keep Alive Connection verwenden. Aber ich denke in meinem Fall, dass es jedes Mal eine neue Verbindung herstellt.

Also muss ich eine Keep Alive Verbindung für HttpClient verwenden.

Hier ist mein Code-Schnipsel, jede Hilfe wäre sehr geschätzt.

%Vor%

und auch logcat logs ist:

%Vor%     
G M Ramesh 03.12.2012, 04:45
quelle

3 Antworten

6
  

10: 07: 29.746: D / org.apache.http.headers (1529): & gt; & gt; Verbindung: Keep-Alive

Sie fordern Keepalive an.

  

10: 07: 29,836: D / org.apache.http.wire (1529): & lt; & lt; "Verbindung: schließen [EOL]"

Der Server lehnt dies ab.

Nichts, was Sie dazu an Ihrem Ende tun können.

    
EJP 03.12.2012, 04:49
quelle
2

Von HTTP 1.1 ist Keep-Alive standardmäßig aktiviert. Sie müssten die Verbindung schließen, wenn Sie nicht möchten, dass sie bei der Verwendung von HTTP 1.1 explizit wiederverwendet wird.

Für 1.0 ist ein Header festgelegt, den Sie für diese Verbindung festlegen: "Keep-alive" Dies zeigt nur den Server an, auf dem Sie die Verbindung wiederverwenden möchten. Unter Stress oder aus anderen Gründen könnte der Server sich anders verhalten, wie unten erläutert.

Für die meisten Zwecke sind die meisten Antworten hier korrekt, wo Sie Keep Alive Header hinzufügen und es funktioniert gut. Die folgende Erklärung gilt für die Szenarien, in denen Sie das getan haben, aber es funktioniert immer noch nicht.

Die serverseitigen Probleme treten auf

Normalerweise würde sich eine Antwort auf ein Setup konzentrieren, wenn sich der Server normal verhält, aber das ist nicht vollständig richtig. Server (wie Rudra ) sind so aufgebaut, dass sie sich in verschiedenen Situationen unterschiedlich verhalten. Keep-Alive enthält eine Reihe von Anforderungen, die der Server erfüllen muss, bevor er die Verbindung abbricht. Dies dient dazu, den Dienst auch anderen zu ermöglichen. Bei hoher Auslastung können einige Server daher die Anzahl der Keep-Alive-Anforderungen reduzieren für jede neue Verbindung serviert.

Es gibt auch eine Zeitüberschreitung, die von der letzten empfangenen Anforderung ausgeht, die schließlich zu einer Trennung führen würde, wenn in diesem Zeitfenster keine weiteren Anforderungen mehr gestellt werden. Nur wenige moderne Server könnten dies ändern, basierend auf der Kapazität, die sie momentan haben, oder sie können sie in Panik auf 0 reduzieren, was Keep-Alive bedeutungslos macht. Wenn also der Server, mit dem Sie eine Verbindung herstellen möchten, eine dieser Bedingungen (Rennen, Panik) durchläuft, kann er Ihre Anfrage verwerfen.

Die Clientseite tritt auf

Für den Dokumentationszweck. Von hc.apache.org :

  

HttpClient tut immer sein Bestes, um Verbindungen wiederzuverwenden. Verbindung   Die Persistenz ist standardmäßig aktiviert und erfordert keine Konfiguration. Unter   In einigen Situationen kann dies zu undichten Verbindungen führen und daher verloren gehen   Ressourcen. Die einfachste Methode zum Deaktivieren der Verbindungspersistenz ist   Bereitstellen oder Erweitern eines Verbindungsmanagers, der Verbindungen erzwingt   nach der Veröffentlichung in der releaseConnection-Methode.

HttpClient bietet diese (lies: trivialen) Dinge Out Of The Box. Aber es gibt noch andere Dinge, die von Apache angeboten werden, die Sie hinzufügen können, um die Leistung zu verbessern.

ConnectionManager können zum Beispiel für HttpClient angepasst werden.

Daher kann der Verbindungsmanager, den Sie möglicherweise verwenden, die Keep-Alive- / Verbindungspersistenz blockieren (dies trifft in Ihrem Fall nicht zu, aber in einigen anderen Fällen ist dies wahrscheinlich der Fall). Dies könnte eine völlig unbekannte / abstrakte Tatsache für Sie sein, wenn Sie das Client-Objekt für die Aufrufe von einer API erhalten. Ein Beispiel, wie dies angepasst werden kann, wurde unten aufgeführt (aus der Apache Connection Management-Dokumentation)

%Vor%

(Weitere Informationen finden Sie in Apache-Dokumentation zur Verbindungsverwaltung ) / p>

Wenn Sie mit diesem Problem konfrontiert sind, probieren Sie es ohne ein CM aus oder erstellen Sie Ihr eigenes HttpClient-Objekt. Es ist nicht notwendig, ein CM für mehrere Verbindungen zu verwenden. Die eingebaute CM ist fair genug. Wenn Sie einen Leistungsverlust feststellen, können Sie Ihren eigenen Verbindungsmanager schreiben.

In Ihrem Fall ist Ihr Server jedoch nicht sehr hilfreich, weil er Keep-Alive überhaupt nicht honoriert, selbst wenn Sie diese Header haben und was nicht. Sie müssten als Antwort auf den Timeout-Header überprüfen, ob eine neue Anforderung an den Server gesendet werden soll, um festzustellen, ob der Server eine Beanstandung ist.

    
Kumar Mani 31.05.2016 02:26
quelle
0

Warum verwenden Sie nicht denselben Client für alle Ihre Anfragen?

Ich habe an einer App gearbeitet, die viele Daten für viele Web-Dienste anfordern muss, und dafür verwende ich nur einen statischen Client und funktioniert perfekt!

Ich habe eine Klasse gemacht, die den HttpClient zurückgibt und eine andere Klasse, die alle meine Anfragen verwaltet (POST und GET), nett und einfach;)

    
Diego Ramírez 01.04.2015 00:55
quelle