Artikel mit ‘Socket’ getagged

Webserver in Java

Am Freitag, 11. Januar 2008 veröffentlicht unter Programmieren

Als 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

Sockets mit Java

Am Samstag, 08. Dezember 2007 veröffentlicht unter Programmieren

In TI ist momentan eine Aufgabe in C eine Socketabfrage zu starten. Adrian hat ja bereits gezeigt, wie das toll in Haskell geht, und da ich C auch absolut nicht mag und ewig gebraucht habe, um es hinzubekommen, wollte ich schauen, wie das in Java geht – natürlich geht es hier viel einfacher und logischer:

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

public class GetString {
  public static void main(String[] args) {
    if(args.length == 2) {
      try {
      // Wandelt 2. Parameter in int
      int port = Integer.parseInt(args[1]);
      // neuer Socket mit Hostname und Port wird erschaffen und geöffnet
      Socket s = new Socket(args[0],port);
      // wir lauschen am Socket über den InputStream
      InputStream in = s.getInputStream();
      byte[] b = new byte[1024];
      in.read(b); // wir lesen vom InputStream ins Bytearray ein
      String out = "";
      // solange noch was im Array steht, wandle byte in char um
      // und hänge es an die Ausgabe an
      for(int i=0; i<b.length;i++)
        if(b[i] != 0)
          out += (char)b[i];
      }
      // String ausgeben und Verbindung schließen
      System.out.println(out);
      s.close();
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}

Wenn man jetzt also über die Konsole java GetString time.fu-berlin.de 13 aufruft erhält man die aktuelle Zeit Sat Dec 8 00:24:06 2007

Letztes Update am 4.05.2009 10:12

Naja's Blog
© 2007-2010 Naja's Corner
Artikel (RSS) und Kommentare (RSS).
Creative Commons License