# HttpURLConnection POST splittet Daten in zwei Pakete



## Stephan.Woebbeking (24. Mrz 2009)

Servus zusammen!

Wieder mal hänge ich an einem Punkt und denke, das kann's nicht sein. Eigentlich ist alles klar, es will aber trotzdem nicht:

Ich möchte eine Web-Applikation über ein Java Programm ansteuern. Nehme mir die URL, hole die HttpURLConnection. Da werden ein paar Properties gesetzt und dann über den Stream die eigentlichen Daten gepostet... Klappt aber nicht, der Server meldet sich zwar, hat aber die Anfrage nicht wirklich verstanden.

Darafhin hab ich mir den Verkehr (Netzwerk!  ) mal mit Wireshark angeschaut und mit einem Firefox verglichen, weil der kann es ja. Weitestgehend sind die beiden Konversationen gleich, der signifikanteste (in meinen Augen) Unterschied ist, dass mein Java lediglich die Properties wegschickt; das endet mit der Länge der POST Infos. Dann ist das Paket zu Ende. Die Post Daten kommen erst im nächsten Paket. Längenmässig wäre das alles kein Problem zusammen zu schicken.

Nun meine Fragen:
- Kann das tatsächlich die Ursache sein?
- Oder sollte / muss das TCP/IP/HTTP Protokoll das transparent handeln und der Server weiss gar nicht, dass es zwei Pakete waren?
- Kann man das in der HttpURLConnection irgendwo einstellen???
- Warum tut mein Java das (bäh)? 

Irgendwelche Anregungen?

Danke,
Stephan


----------



## tuxedo (24. Mrz 2009)

Wie groß (bytes bzw kbytes) sind denn deine Properties? Bin was HTTP anbelangt auch nicht sonderlich fit. Aber vllt. läuft der Sende-Puffer voll, so dass er deshalb ein zweites Paket draus macht. Allerdings wüsste ich jetzt auch nicht wie man das bei HttpUrlConnection ändern könnte.

Auf der anderen Seite: Der Server sollte alles entgegen nehmen was er bekommt. Irgendwo wird ja im Header auch stehen wieviel er bekommt, bzw. wann er alles erhalten hat, um daraufhin die Antwort zu formulieren.

- Alex


----------



## Stephan.Woebbeking (24. Mrz 2009)

Danke für die schnelle Reaktion,

aber ich fürchte das bringt uns noch nicht weiter; testweise habe ich auch schon probiert bis auf eines, alle Properties rauszuwerfen und auch den Inhalt bis auf einen Placebo zu kürzen; nur um rauszufinden, ob es an irgendwelchen Längen liegt. Aber selbst wenn beide Pakete zusammen deutlich kürzer sind als z.B. das, was vom Firefox versendet wird, macht Java ZWEI Pakete daraus.

Stephan


----------



## musiKk (24. Mrz 2009)

Klingt verrückt. Allerdings wird das ohne Code etwas schwierig. Vielleicht könnte auch der Trace helfen.


----------



## Gelöschtes Mitglied 5909 (24. Mrz 2009)

probier alternativ mal den Apache Commons HTTPClient aus oder versende die raw daten über ein Socket

Aber imo sollte es kein Unterschied machen wie viele Packete das sind, es wird (wie vorher schon gesagt) eher was am Header kaputt sein.


----------



## Stephan.Woebbeking (24. Mrz 2009)

Ok, der Code ist definitiv noch quick-n-dirty, aber solange es nicht läuft mach ich mir da auch noch nicht wirklich Gedanken drum... Hoffe ihr findet durch. 

[HIGHLIGHT="Java"]
private static Vector doRetrieve(String method, String url, Vector data, String data2) {
	String str = "";
	BufferedReader in;
	PrintWriter out;
	BufferedWriter bufferedWriter;
	Vector res = new Vector();
	URL url2;
	HttpURLConnection con;

	try {
		if (data == null) {
			Track.track("doRetrieve(" + method + ", " + url + ", null) called");			
		} else {
			Track.track("doRetrieve(" + method + ", " + url + ", Vector(" + data.size() + ") called");
		}
		url2 = new URL(url);

		con = (HttpURLConnection) url2.openConnection();
		if ( data != null || data2 != null )
			con.setDoOutput( true );
		con.setRequestMethod(method);

		con.setRequestProperty( "Host", "www.mix-max.de" );
		con.setRequestProperty( "User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1 .9.0.7) Gecko/20 09021910 Firefox /3.0.7" );
		con.setRequestProperty( "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" );
		con.setRequestProperty( "Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3" );
		con.setRequestProperty( "Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q =0.7" );
		con.setRequestProperty( "Keep-Alive", "300" );
		con.setRequestProperty( "Connection", "keep-alive" );
		con.setRequestProperty( "Referer", "http://www.mix-max.de/" );

		if (data != null) {
			out = new PrintWriter(con.getOutputStream(), true);
			for (int a = 0; a < data.size(); a++) {
				out.print( (String) data.get(a) );
			}
			out.close();
		}
		if ( data2 != null ) {
			bufferedWriter = new BufferedWriter( new OutputStreamWriter( con.getOutputStream() ) );
			bufferedWriter.write( data2 );
			bufferedWriter.close();					
		}
		con.connect();

		in = new BufferedReader(new InputStreamReader(con.getInputStream()));
		while (str != null) {
			str = in.readLine();
			if ( res.size() == 0 )				Track.track(  str );
			if ( str != null ) 					res.add(str);
		}
		Track.track("Read " + res.size() + " lines of text as answer");

		in.close();
		con.disconnect();
		return res;
	} catch ...
}
[/HIGHLIGHT]

Das Objekt "Track" ist ein etwas komfortableres System.out.println. Das hab ich noch nicht gegen log4j ersetzt; stammt noch aus den Anfängen meiner Entwicklung in dieser Richtung.

M.E. sieht das alles so aus, wie es zig andere auch machen - und da scheint es ja zu klappen. Oder hab ich doch irgendwo ein Komma oder ähnlichen Fliegenschiss übersehen? 

Auf die Idee, mehr Richtung low level zu gehen bin ich auch schon gekommen - aber irgendwie mag ich nicht so recht, weil ich damit ja auch die "Dienstleistung" des high level verliere und nachprogrammiere. Üblicherweise gehe ich auch bei Fehlern davon aus, dass jene in MEINEM Code liegt und eben NICHT im jdk... deshalb müsste es ja auch irgendwie sauber hinzubekommen sein...

Stephan


----------



## musiKk (25. Mrz 2009)

Hm, keine Ahnung. Mit einem GET funktionierts. Mit einem POST krieg ich eine 500, weil ich nicht weiß, was ich da hinschicken muss. Aber der Request wird als ein Paket verschickt.


----------



## Stephan.Woebbeking (25. Mrz 2009)

??? In einem Paket... Hast du vermutlich auch mit sowas wie Wireshark angeschaut? Mit genau dem Code? Keine Ahnung, woran das dann noch liegen kann... Ich arbeite mittlerweile mit jdk 1.6.0_11, könnte das ein Grund sein? Nu weiss ich echt nimmer weiter. :-(


----------



## musiKk (26. Mrz 2009)

Nun, ich habe natürlich alles, was ich nicht zuordnen konnte, rausgeworfen. Das meiste sind ja Methodenparameter. Von daher kann mein Testfall natürlich unzutreffend sein.


----------



## Stephan.Woebbeking (31. Mrz 2009)

Kurzes Update:

Nach weiterem Probieren bin ich nicht wirklich weiter gekommen. Allerdings habe ich festgestellt, dass die Webseite, die ich für den Test verwendet habe auch bei sehr, sehr genau nachgebildetem Request diesen nicht versteht. Woran das liegt, kann ich nicht feststellen.

Mittlerweile habe ich meine Anstrengungen tatsächlich auf Suns HttpClient umgeleitet. Dort habe ich es mit einer anderen Seite zumindest hinbekommen. Der Datenaustausch funktioniert (rudimentär) und der Request wird tatsächlich in einem einzigen Paket geschickt. Das war mir mit der Standard HttpURLConnection nicht mehr gelungen.


----------

