Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

java frage

draso / 11 Antworten / Baumansicht Nickles

hallo,

hab eine kleine java application geschrieben die mich mit meinem apache server auf dem http:// port 80 verbindet
wenn ich den befehl z.b "GET /index.html" funktioniert alles und die html seite wird (natürlich in textform) angezeigt
will ich den forum ohne reconnection wiederholen geht dies allerdings nicht wieder WARUM??
Canceled der apache webserver die connection nach dem request??
aber da müsste ich doch eine exception bekommen !!

bei Antwort benachrichtigen
philipps draso „java frage“
Optionen

Hi draso!

Ob Apache die Verbindung trennt kommt u.a. auf Deinen Request an und auch wie der jeweilige Apache Server konfiguriert ist.
Falls bei Apache "Connection:Close" eingestellt ist (in "httpd.conf"), dann kannst Du nix machen. Du kannst dies jedoch (in "httpd.conf") auf "Connection:keep-alive" ändern. Dies ist nebenbei auch die Standardeinstellung und falls Du nach der Installation nix verändert hast sollte es auch so sein.

Dein Request sollte korrekt wie folgt aussehen:
----

GET /index.html HTTP/1.1
Host:localhost
Connection:keep-alive


-----

Ich nehme mal an, dass Du per java.net.Socket eine Verbindung zu Port 80 herstellst. Eine Exception bei einer getrennten Verbindung solltest Du hier nicht bekommen. Schau Dir mal die API-Doku für Sockets an um die Exceptions zu identifizieren:

http://java.sun.com/j2se/1.4.2/docs/api/java/net/Socket.html

Sicher benutzt Du auch den Syntax: "Socket.getInputStream()" um Dir 'nen Inputstream zum übermitteln des Requests an den Server zu verschaffen. Vergesse hier nicht, dass Du nach der letzten Zeile des Requests eine Leerzeile einfügen musst. Das ist GANZ GANZ wichtig!!!!

Hoffe Dir hilft das ein bisserl weiter!

bei Antwort benachrichtigen
draso philipps „Hi draso! Ob Apache die Verbindung trennt kommt u.a. auf Deinen Request an und...“
Optionen

danke,

werds gleich ausprobieren
noch eine Frage:
ist es irgendwie möglich ,dass man in eine bestehende verbindung die allerdings nicht in der java application aufgebaut wurde, eingreift und das port auf dem lokalen pc sozusagen abhört?

bei Antwort benachrichtigen
draso Nachtrag zu: „danke, werds gleich ausprobieren noch eine Frage: ist es irgendwie möglich...“
Optionen

ich glaub ich weiß nun wie es geht
mit nem datagramsocket
aber muss erst nochmal schaun

bei Antwort benachrichtigen
draso philipps „Hi draso! Ob Apache die Verbindung trennt kommt u.a. auf Deinen Request an und...“
Optionen

hab nun nochmal probiert!!
wenn ich den request schreibe mit HTTP/1.1
z.b. out.println("GET /hw02b/hw02b1.html HTTP/1.1\nHost:localhost\nConnection:keep-alive ");

funktioniert zwar die anfrage aber ich bekomm keine antwort mehr
wenn ich hingegen ohne HTTP/1.1
bekomm ich eine Antwort

nun denkst du wahrscheinlich dass dies sein könnte, wegen eines
client sent HTTP/1.1 request without hostname
aber wenn ich ja den Host:localhost hinschreib funktionierts ja mit der anfrage und in der error.log wird auch nichts eingetragen.

woran könnt das nun liegen ??
danke für deine HILFE

bei Antwort benachrichtigen
philipps draso „hab nun nochmal probiert!! wenn ich den request schreibe mit HTTP/1.1 z.b....“
Optionen

Du musst eine LEERZEILE an die letzte Zeile des Requests anhängen (siehe meinen letzten Post) :-)

Versuch mal folgendes:

System.out.println("GET /hw02b/hw02b1.html HTTP/1.1");
System.out.println("Host:localhost");
System.out.println("Connection:keep-alive");
System.out.println("");

Indem Du out.println() anstatt out.print() verwendest, hängst Du automatisch an jede Zeile einen Newline-Character (\n) an.

Ausprobieren.... :-)

bei Antwort benachrichtigen
draso philipps „Du musst eine LEERZEILE an die letzte Zeile des Requests anhängen siehe meinen...“
Optionen

jawoll
super
VIELEN DANK
liegt das an der letzten Zeile ??

bei Antwort benachrichtigen
draso Nachtrag zu: „jawoll super VIELEN DANK liegt das an der letzten Zeile ??“
Optionen

Du nach der letzten Zeile des Requests eine Leerzeile einfügen musst
Hast du eh schon geschrieben
NUR hab ich mich zuerst verlesen und LEERZEICHEN gelesen ;-)

Danke nochmal

bei Antwort benachrichtigen
draso Nachtrag zu: „Du nach der letzten Zeile des Requests eine Leerzeile einfügen musst Hast du eh...“
Optionen

noch eine kleine Frage:
gibt es irgendeine Seite wo ich genügend information über die verfassung der requests nachlesen kann?
wie z.b. bei der POST anweisung

bei Antwort benachrichtigen
draso philipps „Du musst eine LEERZEILE an die letzte Zeile des Requests anhängen siehe meinen...“
Optionen

Wiegesagt es funktioniert aber etwas was mir noch nicht aufgefallen ist ist, dass wenn ich den html code ausgebe mit z.b.
while(in.read()!=-1){
System.out.print((char)in.read());
}
System.out.println("fertig gelesen");
nach dem letzten tag des

bei Antwort benachrichtigen
philipps draso „Wiegesagt es funktioniert aber etwas was mir noch nicht aufgefallen ist ist,...“
Optionen

Hallo!
ich kann mir eigentlich nicht erklären woran das liegt - hmm :-)

Versuch aber mal folgendes. Da Du ja ohnehin nur Strings liest bzw. schreibst, kannst Du den InputStream von der Socket in einen BufferedReader einschliessen (wrapping):

===================================

BufferedReader read;
string loop;
read = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (loop==read.readLine()) {
System.out.println(loop);
}
System.out.println("fertig gelesen");

==============================

Das sollte eigentlich Abhilfe schaffen. Merke: dieser Konstrukt funktioniert nicht zum lesen von Binärdaten!

bei Antwort benachrichtigen
philipps draso „java frage“
Optionen

Nochmal Hallo!

Freut mich, dass es jetzt funktioniert :-)

Ein bisschen mehr über das HTTP Protokoll (also auch die Requests) kannst Du sicherlich über google herausfinden. Gib einfach mal exklusiv "HTTP Protokoll" ein.

Die "Hochheit" über alle diese Infos ist jedoch das World-Wide-Web Consortium:

http://www.w3c.org

oder spezifischer:

http://www.w3c.org/Protocols

Da sind alle Spezifikationen vom HTTP Protokoll zu finden. Die Seite ist in Englisch und für Anfänger vielleicht etwas unübersichtlich.


HTTP Post ist eigentlich genau das gleiche wie HTTP Get. Der Unterschied ist lediglich, dass Du statt GET, POST schreibst und nach der finalen Leerzeile (mit der Du Probleme hattest :-)) eine Zeile mit den Post-Variablen kommt.

Falls Du noch Fragen hast, einfach posten... :-)

bei Antwort benachrichtigen