Webserver in Java
Am Freitag, 11. Januar 2008 veröffentlicht unter ProgrammierenAls Erweiterung zu dem vorhergehenden Beitrag Sockets in Java gibt es nun auch passend zum letzten TI Aufgabenblatt eine simple Webserver-Implementierung, die einfache GET Anfragen bearbeitet. Dabei lauscht der Server auf dem angegebenen Port und sucht um angegebenen Verzeichnis nach den angeforderten Dateien.
Natürlich kann der Webserver auch Bilder … Ich glaube, man könnte durch entsprechende Änderung in der Methode typ auch jeden anderen Mime-Typ definieren.
import java.io.*;
import java.net.*;
import java.util.regex.Pattern;
public class Webserver {
final static int BUFFER = 512;
public static void main(String[] args) {
if(args.length < 2)
throw new RuntimeException("Zuwenig Parameter!");
webserver(Integer.parseInt(args[0]),args[1]);
System.out.println("Das hier sollte nie erreicht werden!");
}
public static void webserver(int port, String pfad) {
ServerSocket server;
Socket client;
InputStream in;
String angefragteDatei, inStr = "";
String[] get;
File datei;
byte[] buffer = new byte[BUFFER];
try {
server = new ServerSocket(port);
while(true) {
client = server.accept();
System.out.println("Erfolgreich Verbindung zum Client aufgebaut.");
in = client.getInputStream();
in.read(buffer);
inStr = byteToString(buffer);
get = inStr.split(" ", 3);
if(get[0].equals("GET")) {
angefragteDatei = get[1];
}
else
throw new RuntimeException("Keine GET Anfrage!");
if(angefragteDatei.equals("/"))
angefragteDatei = "/index.html";
System.out.println("Es wurde die Datei " + angefragteDatei + " angefragt.");
datei = new File(pfad+angefragteDatei);
if(!datei.exists()) {
System.out.println("Datei wurde nicht gefunden, schreibe 404 Meldung:");
schreibe404(client);
}
else {
System.out.println("Folgendes wurde geschrieben:");
schreibeDatei(datei,client);
}
client.close();
System.out.println("Verbindung zum Client erfolgreich beendet.\nBereit für neue Anfrage...");
}
} catch (IOException e) {
e.printStackTrace();
}
}
// liest die angeforderte Datei f ein und schreibt sie in den Clientsocket c.
private static void schreibeDatei(File f, Socket c) {
FileInputStream fileIn;
try {
OutputStream out = c.getOutputStream();
fileIn = new FileInputStream(f);
byte[] buffer = new byte[BUFFER];
String header = "HTTP/1.1 200 OK\r\nContent-Type: " + typ(f) + "\r\n\n";
System.out.print(header);
out.write(stringToByte(header));
while (fileIn.read(buffer) != -1) {
out.write(buffer);
System.out.print(byteToString(buffer));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// schreibt die 404 Fehlermeldung in den Clientsocket
private static void schreibe404(Socket c) {
String error = "HTTP/1.1 404 Not Found\r\n\n<html>\n<head><title>404 - Not Found</title></head>\n<body><h1>404 - Not Found</h1></body>\n</html>\n";
try {
OutputStream out = c.getOutputStream();
byte[] outByte = new byte[error.length()];
for(int i=0;i<outByte.length;i++)
outByte[i] = (byte) error.charAt(i);
System.out.println(error);
out.write(outByte);
} catch (IOException e) {
e.printStackTrace();
}
}
// Findet den Dateityp von File f raus.
private static String typ(File f) {
String tmp = f.getAbsolutePath();
Pattern p = Pattern.compile( "[.]" ); // Damit er nach dem "." Splitten kann. Funktionierte mit split(".") nicht. Warum auch immer.
String[] a = p.split(tmp);
if(a[1].equals("html"))
return "text/html";
if(a[1].equals("jpg"))
return "image/jpeg";
else
return "text/plain";
}
// Wandelt byte-Array in String um
private static String byteToString(byte[] b) {
String tmp = "";
for(int i=0;i<b.length;i++)
tmp += (char) b[i];
return tmp;
}
// Wandelt String in byte-Array um
private static byte[] stringToByte(String s) {
byte[] b = new byte[s.length()];
for(int i=0;i<b.length;i++)
b[i] = (byte) s.charAt(i);
return b;
}
}
webserver.java
Ach, das Teil ist natürlich mal wieder logischer und kürzer und überhaupt cooler als selbiges in C …
Letztes Update am 4.05.2009 10:13
