Wie POSTet man HTML form-daten an Java-Server?

Hallo. Ich hoffe ich bin im richtigen Forum hier.

Ich habe einen primitiv-Java-Server auf einem (beliebigen) port laufen. Dieser wartet auf eine Verbindung eines clients auf diesem Port. Wenn sich also z.B. ein Webbrowser oder telnet auf den port verbindet spuckt der server eine HTML-seite min einer Form aus.
Soweit so gut. Funktioniert, die seite wird angezeigt.
Wenn jetzt der „SUBMIT“-Button geklickt wird, sollen die Felder and den Server zurückübertragen werden.
Leider kommt dabei immer nur der String „POST / HTTP 1.1“ an, dann beendet sich der server von selbst, weil die Verbindung nicht mehr da ist…
Es würde mich mal interessieren, warum das passiert. Wie kann ich sonst Daten an den Server senden?

Freue mich über alle Infos

KIM

Moin

Wenn sich also z.B. ein Webbrowser oder
telnet auf den port verbindet spuckt der server eine
HTML-seite min einer Form aus.

ohne Abfrage, ohne auf das get zu warten ??

Wenn jetzt der „SUBMIT“-Button geklickt wird, sollen die
Felder and den Server zurückübertragen werden.
Leider kommt dabei immer nur der String „POST / HTTP 1.1“ an,
dann beendet sich der server von selbst, weil die Verbindung
nicht mehr da ist…

Das Post funzt nur wenn der Client (Browser) weiss wie er dem Server die Daten schicken kann. Da gibts einen Ar… voll Möglichkeiten nachzulesen hier:

http://www.w3.org/Protocols/rfc2616/rfc2616.html

kommen die Daten an bei einem „Regulären“ Server an ? (sprich: stimmt das java-skript ?)

Wie kann
ich sonst Daten an den Server senden?

Implementier erstmal einen ftp-server, die sind einfacher.

cu

Moin

Wenn sich also z.B. ein Webbrowser oder
telnet auf den port verbindet spuckt der server eine
HTML-seite min einer Form aus.

ohne Abfrage, ohne auf das get zu warten ??

Ja. Ich starte den Java-„Server“ und mache einen Browser auf. Dann geb ich http://localhost ein und, zack, komm da die Seite. Optional geht auch http://localhost: wenns nicht auf 80 läuft…

Wenn jetzt der „SUBMIT“-Button geklickt wird, sollen die
Felder and den Server zurückübertragen werden.
Leider kommt dabei immer nur der String „POST / HTTP 1.1“ an,
dann beendet sich der server von selbst, weil die Verbindung
nicht mehr da ist…

Das Post funzt nur wenn der Client (Browser) weiss wie er dem
Server die Daten schicken kann. Da gibts einen Ar… voll
Möglichkeiten nachzulesen hier:

Danke, guck ich mir gleich mal an…

kommen die Daten an bei einem „Regulären“ Server an ? (sprich:

stimmt das java-skript ?)

Kein Problem, das ganze Formular wird übertragen.

Implementier erstmal einen ftp-server, die sind einfacher.

Geht leider nicht, bringt mich nicht wirklich weiter…

Vielen Dank schon mal!

KIM

Hi.

Ich habe einen primitiv-Java-Server auf einem (beliebigen)
port laufen. Dieser wartet auf eine Verbindung eines clients
auf diesem Port. Wenn sich also z.B. ein Webbrowser oder
telnet auf den port verbindet spuckt der server eine
HTML-seite min einer Form aus.

Von was für einem Java-Server reden wir hier? Ist das ganze ein HTML (Port 80) Server? Heisst primitiv, dass er nur bestimmte Sachen kann?
Was meinst du mit telnet? Sprichst du den Server über „telnet localhost 80“ und Eingabe des HTTP-Requests an?

Soweit so gut. Funktioniert, die seite wird angezeigt.
Wenn jetzt der „SUBMIT“-Button geklickt wird, sollen die
Felder and den Server zurückübertragen werden.
Leider kommt dabei immer nur der String „POST / HTTP 1.1“ an,
dann beendet sich der server von selbst, weil die Verbindung
nicht mehr da ist…

Kann es sein, dass dein Server kein HTTP 1.1 versteht? Es gibt da Unterschiede im den benötigten und übermittelten Daten zwischen HTTP 1.0 und HTTP 1.1

Es würde mich mal interessieren, warum das passiert. Wie kann
ich sonst Daten an den Server senden?

Normalerweise schickt man schon über Forms Daten. Der Webserver ist dann zuständig dafür, diese Daten an die (dynamische) Seite weiterzugeben. Pure HTML-Seiten können mit den Parametern nichts anfangen. Du müßtest schon Serverseitig programmieren.

Bitte mehr Info über den Server und was du machen willst,

mfG,

J.P.Jarolim

Moin

ohne Abfrage, ohne auf das get zu warten ??

Ja. Ich starte den Java-„Server“ und mache einen Browser auf.

Dann schickt der Browser in der Regel eine Liste seiner Fähigkeiten an den Server und fragt nach einer Seite, bei den links evtl. auch nach einem Datei-Listing. Hatte mal eine Versuch gestartet und diese „Anfrage“ ignoriert, daraufhin haben sich einige Browser ziehmlich daneben benommen und ich habs gelassen.

Welchen Browser benutzt du zum testen ?
Was passiert wenn die Seite Bilder enthält ?
Gibts den Quell-code vom Server irgendwo zum download ?

cu

Ich poste mal den „Quellcode“. Das ganz ist als Test in 5 Minuten zusammengestrickt. …siehe unten…
Starten mit :
outserver serv1 = new outserver(80);
serv1.start();

Was ich machen will :
Ich möchte das sich ein beliebiger Webbrowser auf meinen Server verbinden kann, den daraufhin eine HTML-Seite zurückschickt. Der Benutzer kann jetzt unter anderem Textfelder editieren, Buttons drücken usw. Das ganz soll dann zurück an den Server geschickt werden, also ein eintrag wie im Formular würde dafür sorgen, dass die Formulardaten an meinen Server gesandt werden, dieser sie verarbeitet, und wiederum eine HTML-seite an den Browser zurückschickt…
Der Server soll verschiedene Funktionen ausführen können, z.B. Funktionen auf den Rechner auf dem er läuft aufrufen können, Programme starten usw. Auch soll es möglich sein, ganze Dateien auf den Server hochzuladen (Sollte auch mit POST gehen).

Der Server ist kein wirklicher HTML-Server. Das kann apache ganz gut. Allerdings kann ich mit dem Server Sachen machen, die CGI-Scripte nicht erlauben, weil die alle als user „WWWRUN“ laufen.

Was ich nicht verstehe ist, das der „server“ beim abschicken der Formulardaten „POST / HTTP/1.1“ ausgibt, dann kommt „Closed port XXX“
und er beendet sich selbst. Ich vermute der Browser kappt die Verbindung…

Vorschläge willkommen… :wink:

------CUT-HERE-------

import java.net.*;
import java.lang.*;
import java.io.*;

public class outserver extends Thread {

static private long counter = -1;

private ServerSocket sock;
private int socketnumber = 4711;

public outserver(int which_socket) {
socketnumber = which_socket;
counter++;
}

public void run() {
//thread starts here
System.out.println(„Listening on port " + socketnumber);
try {
sock = new ServerSocket(socketnumber);
} catch (IOException ex) { System.out.println(„Socket creation failed“);}
try {
Socket connection = sock.accept();
/* BufferedWriter out = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
out.write(“"-//W3C//DTD HTML 4.01 Transitional//EN"\n"+
""http://www.w3.org/TR/html4/transitional.dtd">\n"+
„\n“+
„\n“+
„\n“+
„\n“+
„Jaja, man sieht es…\n“+
„\n“+
„“);
out.flush();*/
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
// BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String s;
while (!in.ready()) {
s = „“;
while (!in.ready()) {
try {
this.sleep(500);
} catch (InterruptedException ex) {}
}
s = in.readLine();
System.out.print(s);
if (s.compareTo(„quit“) == 0) break;
}
in.close();
// out.close();
} catch (IOException ex) { System.out.println(„Socket.accept failed with error „“ + ex.getMessage() + „““);}
try {
sock.close();
} catch (IOException ex) { System.out.println(„Socket.close failed“);}
System.out.println("Closed port " + socketnumber);
}

}

------CUT-HERE-------

Dass du einfach eine HTML Seite schickst nach dem Socket accept ohne dass du die Anfrage eingelesen hast ist schonmal sehr fragwürdig, funktioniert aber wohl.

Dass sich dein Server beendet ist relativ klar, du hast da eine Schleife mit while (!in.ready())
Das POST ist einige Zeilen lang, also nach dem readline ist der BufferedReader immernoch „ready“ und geht dann direkt raus aus der Schleife. Die Logik deiner while-Schleifen habe ich leider nicht kapiert, sonst würde ich evtl. sagen können was falsch ist :wink:

Du solltest dir das HTTP Protokoll nochmal anschauen :smile:

Grüße
Bruno

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Was ich nicht verstehe ist, das der „server“ beim abschicken
der Formulardaten „POST / HTTP/1.1“ ausgibt, dann kommt
„Closed port XXX“
und er beendet sich selbst. Ich vermute der Browser kappt die
Verbindung…

Vorschläge willkommen… :wink:

Na dann wollen wir mal…

 try {
 sock = new ServerSocket(socketnumber);
 } catch (IOException ex) { System.out.println("Socket
creation failed");}

wenn du hier einen neuen try-catch-block anfängst und der erste schon fehlgeschlagen ist …

 try {
 Socket connection = sock.accept();

/\* BufferedWriter out = new BufferedWriter(new
OutputStreamWriter(connection.getOutputStream()));

Das /* ist hoffentlich ein Copy-paste Fehler… ?

(…)

 out.flush();\*/

Die ausklammerung wird den Browser ein bisschen verwirren…

 BufferedReader in = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
 String s;
 while (!in.ready()) {

das ist schlecht denn laut def. von ready:

„An InputStreamReader is ready if its input buffer is not empty, or if bytes are available to be read from the underlying byte stream.“

„available from underlying byte Stream“ heist in dem Fall im klartext: der Browser hat schon was geschickt.

besser wäre einfach so, ohne „kontrolle“ readLine() aufzurufen, also so:

 BufferedReader in = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
 try {
 while (true){
 String s = in.readLine();
 System.out.println ("Browser answer : "+s);
 if (s.contains ("quit")({
 throw new Exception ("User will nicht mehr");
 } else {
 //Daten in s verarbeiten oder speichern bis die Form komplett ist.
 }
 }
 } catch (Exception E){
 //Hier kommt man an wenn entweder "quit" geschickt wurde, 
 //oder der Browser aufgelegt hat.
 }

der Thread bleibt dann solange in readyLine bis der Browser eine Zeile komplette geschickt hat, ganz ohne „sleep“ und busy-waiting. (das while(true) kann man noch ein bisserl verfeinern, hängt aber von deinem „Problem“ ab)

cu

Du solltest dir das HTTP Protokoll nochmal anschauen :smile:

Der HTTP Header fehlt übrigens in dem was du an den CLient sendest… dass sich da überhaupt was tut ist das größte Wunder *G*

So, bis auf ein kleines Problem geht es jetzt.
Danke für die Hilfe. Das ready() löst bei mir in der Scheife übrigens KEINE Exception die auf „Connection reset by peer“ hindeuten würde… seltsam. Die Lösung mit readLine() ist gut.
Ich probiere vom stream zu lesen. Falls es nicht geht wird gewartet und wieder versucht. Wenn es geht wird der string an die nachricht drangehängt, bis der stream mal nicht mehr ready() ist, was darauf hindeutet, das der Browser fertig gesandt hat (?).
Der String wird verarbeitet, dann gehts von vorne los…

Ein kleines Problem gibt es noch. Die Seite wird aufgebaut, aber der Browser ist nie fertig mit laden. Ich schätze ich muss wirklich mal das Protokol richtig lesen. Da fehlt wohl noch irgend ein token nach dem senden der Seite… :wink:

KIM

while (!quit) {
try {
String s;
while ((s = input.readLine()) == null)
try {
//sleep if no input
this.sleep(300);
} catch (InterruptedException e) {}
//if not, concat string
message += s;
//if there is no more input, the browser finished sending data
//so, process data
if (!input.ready()) {
//System.out.print(message);
respondTo(message);
message = „“;
} //if
} catch (IOException e) {
System.out.println(this.getName() + " - IOException - " + e.getMessage());
//if (e.getMessage().startsWith(„Connection reset by peer“))
quit = true;
} //catch
} //while

Hi.

Du solltest das Protokoll wirklich mal näher anschauen - Der HTTP Server sollte standardmäßig im Header die Größe der Datei mitgeben, die er gerade ausliefert.

Du kannst dir ja mal Samples von anderen Leuten anschauen. Unter http://www.jibble.org/miniwebserver/ findest du einen ~4kB grossen Java-Webserver mit von Paul Mutton.

Unter http://www.jibble.org/jibblewebserver.php findest du einen (wahrscheinlich den gleichen) aufgebohrten Java-Webserver mit auch nur 9,6kB ebenfalls von Paul Mutton.

mfG,

J.P.Jarolim

mfG,

J.P.Jarolim

Moin

Ich probiere vom stream zu lesen. Falls es nicht geht wird
gewartet und wieder versucht. Wenn es geht wird der string an
die nachricht drangehängt, bis der stream mal nicht mehr
ready() ist, was darauf hindeutet, das der Browser fertig
gesandt hat (?).

Lies mal die Documentation von java: ready gibt false zurück wenn die Verbingung TOT ist, also der Browser AUFGELEGT hat. (Passiert wenn ein anderer Server angesprochen werden soll, oder nach einem Time-out von ± 10 min)

Ein kleines Problem gibt es noch. Die Seite wird aufgebaut,
aber der Browser ist nie fertig mit laden.

Weil Header (und Tail ?) fehlen.

Ich schätze ich

muss wirklich mal das Protokol richtig lesen. Da fehlt wohl
noch irgend ein token nach dem senden der Seite… :wink:

VOR den Senden.

while (!quit) {
try {
String s;

was soll das werden ??

while ((s = input.readLine()) == null)

try {
//sleep if no input

nein, der schälft jedesmal…

this.sleep(300);
} catch (InterruptedException e) {}
//if not, concat string
message += s;
if (!input.ready()) {

Hier hat der Browser die Verbindung schon unterbrochen, respond ist dann sinnfrei.

//System.out.print(message);
respondTo(message);
message = „“;
}

noch 2 Dinge:

  1. Code sollte mit PRE eingeramt werden
  2. nimm toten Code raus, BEVOR du was postes.

cu

Lies mal die Documentation von java: ready gibt false zurück
wenn die Verbingung TOT ist, also der Browser AUFGELEGT hat.
(Passiert wenn ein anderer Server angesprochen werden soll,
oder nach einem Time-out von ± 10 min)

Also : In der Beschreibung von „ready()“ steht :
„Tell whether this stream is ready to be read. A buffered character stream is ready if the buffer is not empty, or if the underlying character stream is ready.“

Heisst doch :

  • der Strom ist bereit, also verbunden, lesbar,…
  • Da sind Zeichen drin, die ich lesen kann

Der Strom geht dicht, wenn man STOP drückt, oder eine andere Adresse eingibt und bestätigt, was den Socket dichtmacht, die Verbidung beendet…

Ein kleines Problem gibt es noch. Die Seite wird aufgebaut,
aber der Browser ist nie fertig mit laden.

Weil Header (und Tail ?) fehlen.

Jo. Ich hab die Doku jetzt auch gelesen. Sorry…
Habe auch keine Antwort mehr erwartet. Wollte hier nicht stören…

was soll das werden ??

while ((s = input.readLine()) == null)

Das hab ich aus Beispielcode und das funktioniert ganz gut…
„readLine Returns:
A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached“

nein, der schälft jedesmal…

Nein, stimmt nicht…

if (!input.ready()) {

Hier hat der Browser die Verbindung schon unterbrochen,
respond ist dann sinnfrei.

Stimmt auch nicht, sonst würde die HTML-Seite nicht ankommen…
Wollte hier keinen vollabern, ärgern, oder sonstwas. Danke für die Hilfe!

KIM

Moin

Also : In der Beschreibung von „ready()“ steht :
„Tell whether this stream is ready to be read. A buffered
character stream is ready if the buffer is not empty, or if
the underlying character stream is ready.“

Heisst doch :

  • der Strom ist bereit, also verbunden, lesbar,…

verbunden, ja.

  • Da sind Zeichen drin, die ich lesen kann

jn. wenn noch Zeichen da sind ist ready immer true. Sind keine Zeichen mehr da so bestimmt der „verbunden“-Zustand die Ausgabe von ready().

Ein Stream kann also ready() sein ohne das man jemals noch Zeichen aus ihm rausholen kann. (Test: eine leere Datei, FileInputStream + BufferInputStream)

Der Strom geht dicht, wenn man STOP drückt,

nicht bei allen Browsern.

oder eine andere
Adresse eingibt und bestätigt, was den Socket dichtmacht, die
Verbidung beendet…

jupp.

was soll das werden ??

while ((s = input.readLine()) == null)

Das hab ich aus Beispielcode und das funktioniert ganz gut…
„readLine Returns:
A String containing the contents of the line, not including
any line-termination characters, or null if the end of the
stream has been reached“

und der String wird dann s zugewiesen. Was aus der Klammer „(s = input.readLine())“ rauskommt ist nicht so klar. Das ist kein sauberer Code. Wenn du Programmieranfänger bist solltest du sowas nicht benutzen.

Stimmt auch nicht, sonst würde die HTML-Seite nicht
ankommen…

Ich dachte die Seite wär bei der Zeile schon versendet worden ? Steht zumindest mal so in dem geposteten Code.

cu