Staram się napisać najprostszą możliwą aplikację serwerową w Javie, wyświetlając formularz html z wejściem textarea, który po przesłaniu daje mi możliwość parsowania xml wpisanego w to pole tekstowe. Na razie mogę zbudować prosty serwer oparty ServerSocket tak:Czytanie danych POST z formularza html wysłanych na serverocket
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class WebServer {
protected void start() {
ServerSocket s;
String gets = "";
System.out.println("Start on port 80");
try {
// create the main server socket
s = new ServerSocket(80);
} catch (Exception e) {
System.out.println("Error: " + e);
return;
}
System.out.println("Waiting for connection");
for (;;) {
try {
// wait for a connection
Socket remote = s.accept();
// remote is now the connected socket
System.out.println("Connection, sending data.");
BufferedReader in = new BufferedReader(new InputStreamReader(
remote.getInputStream()));
PrintWriter out = new PrintWriter(remote.getOutputStream());
String str = ".";
while (!str.equals("")) {
str = in.readLine();
if (str.contains("GET")){
gets = str;
break;
}
}
out.println("HTTP/1.0 200 OK");
out.println("Content-Type: text/html");
out.println("");
// Send the HTML page
String method = "get";
out.print("<html><form method="+method+">");
out.print("<textarea name=we></textarea></br>");
out.print("<input type=text name=a><input type=submit></form></html>");
out.println(gets);
out.flush();
remote.close();
} catch (Exception e) {
System.out.println("Error: " + e);
}
}
}
public static void main(String args[]) {
WebServer ws = new WebServer();
ws.start();
}
}
Po postaci (textarea z XML i jednego dodatkowego wprowadzania tekstu) jest składany w „dostaje” String-typ zmiennej Mam urlencoded wartości moich zmiennych (wyświetlany również na ekranie, wygląda na to, że:
gets = GET /?we=%3Cnetwork+ip_addr%3D%2210.0.0.0%2F8%22+save_ip%3D%22true%22%3E%0D%0A%3Csubnet+interf_used%3D%22200%22+name%3D%22lan1%22+%2F%3E%0D%0A%3Csubnet+interf_used%3D%22254%22+name%3D%22lan2%22+%2F%3E%0D%0A%3C%2Fnetwork%3E&a=fooBar HTTP/1.1
Co mogę zrobić, aby dostać się do zmiany metody POST (jeśli ja po prostu zmienić go w formie, niż umieścić "if (str.contains (" POST ")) { "daje mi ciąg znaków takich jak:
gets = POST/HTTP/1.1
bez zmiennych. A po tym, jak mogę użyć xml z mojego pola tekstowego (zwanego "my")?
Cześć qqryq. Mam ten sam kod. Czy wymyśliłeś, jak przeczytać ciało POST?Próbowałem uruchomić drugi cykl, jak mówi cygri, ale metody inputStream.read lub bufferedReader.readline blokują mój wątek. Jak czytasz ciało POST? – Alexmelyon
Och, zdałem sobie sprawę! Potrzebuję przeczytać nagłówek "Content-Length:" i zrobić dla cyklu na taką długość. – Alexmelyon