Liebe Java Forum User
Ich löse gerade die folgende Hausaufgabe, in der ich von Grund auf einen Webserver bauen, der ein einfaches Suchfeld in einem Client bedienen soll, um einen in einer Datei zu findenden Eintrag ggf. an den Browser zurückzuliefern.
Ich hänge am Schluß mit der Rückgabe in den Browser, wo die Matches im Browser angezeigt werden sollen. Ich weiß nicht recht wie man das macht, da das Socket ja sofort nach der ersten Bearbeitung der Browseranfrage (dem initialen Laden der Webseite) wieder geschlossen wird. Ich poste hier meinen Code für bessere Nachvollziehbarkeit.
Wie kann ich dem Browser das Ergebnis liefern?
Ich würde mich freuen, wenn Ihr mir schreiben würdet wie das geht.
Viele Grüße,
Semo
Ich löse gerade die folgende Hausaufgabe, in der ich von Grund auf einen Webserver bauen, der ein einfaches Suchfeld in einem Client bedienen soll, um einen in einer Datei zu findenden Eintrag ggf. an den Browser zurückzuliefern.
Ich hänge am Schluß mit der Rückgabe in den Browser, wo die Matches im Browser angezeigt werden sollen. Ich weiß nicht recht wie man das macht, da das Socket ja sofort nach der ersten Bearbeitung der Browseranfrage (dem initialen Laden der Webseite) wieder geschlossen wird. Ich poste hier meinen Code für bessere Nachvollziehbarkeit.
Wie kann ich dem Browser das Ergebnis liefern?
Ich würde mich freuen, wenn Ihr mir schreiben würdet wie das geht.
Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WebServer extends Thread {
public static final String VERSION = "Ultra-Light WebServer 0.2";
@SuppressWarnings("unused")
private File startVerz;
private ServerSocket serverSocket;
private Socket clientSocket;
private boolean running = true;
private BufferedReader br;
final String ae = "%E4";
final String Ae = "%C4";
final String oe = "%F6";
final String Oe = "%D6";
final String ue = "%FC";
final String Ue = "%DC";
final String sz = "%DF";
/**
* Dieser Konstruktor erzeugt ein ServerSocket und prüft, ob auch ein
* Verzeichnis in dem die Startseite liegen soll übergeben wurde.
* Theoretisch wird über die Angabe des Parameters <i>File
* startVerz</i> die Möglichkeit bereitgehalten, daß später
* auch eine direkte Verbindung zu einem Verzeichnis aufgebaut werden kann,
* um z.B. Dateien darin abzulegen oder aufzurufen.
*
* @param startVerz
* Es handelt sich dabei um das Verzeichnis, in dem der Benutzer
* die <i>index.html</i> Datei abgelegt hat.
* @param port
* In diesem Fall ist es ein fest vergebener Port 19000
* @throws IOException
* wird in diesem Fall nicht gefangen.
*/
public WebServer(File startVerz, int port) throws IOException {
startVerz = startVerz.getCanonicalFile();
if (!startVerz.isDirectory()) {
throw new IOException("Kein Verzeichnis erreichbar.");
}
/*
* Mindestanforderung fuer Serverobjekt
*/
serverSocket = new ServerSocket(port);
start();
}
/**
* Diese Methode wird allein dazu genutzt, um den Webserver in einer
* unendlichen Schleife am Leben zu halten. Dazu wird das das im Konstruktor
* erzeugte Socket Objekt abgerufen. Außerdem werden Umlaute ersetzt
* und übergebene Parameter an eine weitere Methode weitergeleitet, die
* den Suchstring ausfiltert.
*
* Hier wird auch das Dokument für die Browseranzeige generiert.
*
* @see java.lang.Thread#run()
*/
public void run() {
while (running) {
try {
Socket socks = serverSocket.accept();
clientSocket = new Socket();
clientSocket = socks;
br = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
String liesMich = br.readLine();
liesMich.replaceAll(ae, "ä");
liesMich.replaceAll(Ae, "Ä");
liesMich.replaceAll(oe, "ö");
liesMich.replaceAll(Oe, "Ö");
liesMich.replaceAll(Ue, "Ü");
liesMich.replaceAll(ue, "ü");
liesMich.replaceAll(sz, "ß");
getPars(liesMich);
System.out.println(liesMich);
PrintWriter pW = new PrintWriter(clientSocket.getOutputStream());
pW.println("HTTP/1.1 200 OK");
pW.println("Connection: closed.");
pW.println("Connection-Type: text/html");
pW.println("\n");
String line = null;
BufferedReader br_Text = new BufferedReader(
new InputStreamReader(new FileInputStream("index.html")));
while ((line = br_Text.readLine()) != null) {
pW.println(line);
}
pW.flush();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* Es werden die Parameter aus dem Suchformular ausgefiltert und mit der
* Teleliste.txt Datei abgeglichen, ob ein Treffer gelandet wird.
*
* @param browserQuery
* enthält den GET String der vom Browser versendet wird.
* @throws IOException
*/
@SuppressWarnings("unchecked")
private void getPars(String browserQuery) {
String findMe = "";
boolean search = false;
@SuppressWarnings("rawtypes")
ArrayList matched = new ArrayList();
browserQuery.toLowerCase();
browserQuery = browserQuery.substring(browserQuery.indexOf('?') + 1,
browserQuery.length());
// Nur Suche starten, wenn etwas im Suchfeld eingegeben wurde
if (browserQuery.length() > 25) {
search = true;
}
// Filtern des Suchstrings
if (search) {
Pattern namePattern = Pattern
.compile("searchstring=[a-z%A-Z%0-9]+");
Matcher nameMatcher = namePattern.matcher(browserQuery);
if (nameMatcher.find()) {
findMe = browserQuery.substring(13, nameMatcher.end());
}
// Datei mit den Telefonbuchdaten laden und zeilenweise vergleichen
try {
BufferedReader in = new BufferedReader(new FileReader(
"/home/semo/workspace/Webserver/bin/telebuch.txt"));
String zeile = null;
while ((zeile = in.readLine()) != null) {
if (zeile.contains(findMe)) {
matched.add(zeile);
// System.out.println(zeile);
}
}
} catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < matched.size(); i++) {
System.out.println(matched.get(i));
}
}
}
@SuppressWarnings("unused")
public static void main(String[] args) {
try {
WebServer server = new WebServer(new File("./"), 19000);
} catch (IOException e) {
System.err.println(e);
}
}
}
Viele Grüße,
Semo