Kay: Problem beim Lesen aus Socket-Verbindung

Hallo,

ich habe einen kleinen Webserver in Java erstellt. Dabei werden die durch einen Client gesendeten Daten aus einer Socket-Verbindung gelesen.
Für die GET-Methode funktioniert das auch sehr gut.
Allerdings habe ich Probleme, die Daten einer POST-Anweisung zu lesen. Ich fülle ein HTML-Formular aus und schicke es mit der Methode POST an den Server - gut.
Die Header-Daten kann ich auch lesen - die verwendete Methode, Dateiname, HTTP-Protokoll, Content-Type, User-Agent etc. lassen sich einwandfrei ermitteln. Die Daten der z.B. Eingabefelder bekomme ich nicht - hab' mal 'nen Codeschnipsel gepostet - wo liegt der Fehler?

Ich danke schon mal für Hilfe - komme nämlich nicht mehr weiter :-)

InputStream is = null;
BufferedReader br = null;
try {
  is = socket.getInputStream();
  br = new BufferedReader(new InputStreamReader(is));
}
catch (IOException e) {
}

String requestLine = "";
try {
  requestLine = br.readLine();
}
catch (IOException e) {
}

String headerLines = requestLine + "\r\n";
String headerLine;
try {
  while ((headerLine = br.readLine()) != null && headerLine.length() > 0)
    headerLines += headerLine + "\r\n";
}
catch (IOException e) {
}

StringTokenizer tokens = new StringTokenizer(requestLine, " ");
String requestMethod = tokens.nextToken();
String fileName = tokens.nextToken();
String httpProtocol = tokens.nextToken();

if (requestMethod.equals("POST")) {
  try {
    byte[] bytes = new byte[2];
    DataInputStream dis = new DataInputStream(is);
    dis.read(bytes);
    dis.close();
    resultString = "" + (char)bytes[0] + (char)bytes[1];
  }
  catch (IOException e) {
  }
}

  1. Hallo,

    StringTokenizer tokens = new StringTokenizer(requestLine, " ");
    String requestMethod = tokens.nextToken();
    String fileName = tokens.nextToken();
    String httpProtocol = tokens.nextToken();

    if (requestMethod.equals("POST")) {
      try {
        byte[] bytes = new byte[2];
        DataInputStream dis = new DataInputStream(is);
        dis.read(bytes);
        dis.close();
        resultString = "" + (char)bytes[0] + (char)bytes[1];
      }
      catch (IOException e) {
      }
    }

    Was passiert denn genau? Welche Testausgaben (System.out.println(variable);) hast Du wo versucht und was haben sie ausgegeben? Welche Fehlermeldungen werden erzeugt?

    Du liest hier zwei Bytes aus. Bei Post werden vom Client in den Request-Headern die Felder Content-type (Content-Type)[1] und Content-length (Content-Length)[1] mitgeliefert. Diese musst Du parsen. Bei Content-type == "application/x-www-form-urlencoded" kannst (_musst_) Du Content-length Zeichen lesen. Bei Content-type == "multipart/form-data" wirds sehr viel komplizierter.

    [1] leider manchmal auch

    viele Grüße

    Axel

    1. Hallo,

      Fehler:

      Content-type (Content-Type)[1] und Content-length (Content-Length)[1]
      [1] leider manchmal auch

      Das leider muss natürlich genau nach der anderen Schreibweise stehen.
      Richtig laut RFC 2616 ist
      Content-Type
      und
      Content-Length.

      viele Grüße

      Axel