Chat über Webserver? Brauche Denkanstoß

RipdEaTh

Mitglied
Hi Leute!

Ich würde gerne ein Chatsystem erstellen, welches über den Browser läuft. Dabei möchte ich keine Applets verwenden, sondern per Aufruf einer URL einen Text senden. Die Anzeige soll auch im Browser erscheinen.
Ich hatte vor langer langer Zeit mal solch ein Chatsystem in der Hand. Das System startete auf dem Server eine Art Mini-Webserver und man konnte dann mittels eines HTML Links sich in den Chat einloggen.

Nun wüsste ich leider nicht, wie ich das am besten umsetzen sollte. Als erstes wäre die Frage, wie kann ich mit Java solch eine Art Mini-Webserver starten, wo das Java-Programm dann auch Daten durch den Browser verarbeiten kann..

Ihr könnt mir da doch sicher helfen :)
Vielen Dank im voraus :)
 
Hi!

Vielen Dank für deine schnelle Antwort.
Geh ich recht in der Annahme, dass die Klasse die du da nennst nur in der EnterpriseEdition zu finden ist?
Kann sie zumindest nicht in mein Eclipse importieren und benutzte die jre ^^
 
Ja und Nein ;)
Die Klasse ist Teil der Servlet API (servlet-api.jar/servlet.jar) die in der EE enthalten ist.
Die benutze ich aber nicht, die Klassen sind auch bei Tomcat dabei ( http://tomcat.apache.org/ ) im Ordner $TOMCAT\common\lib.
Kannst du dir aussuchen ob du jetzt die EE installierst oder Tomcat oder keins von beidem ;) Also wie gesagt, wenn du das als Servlet mit Tomcat machst hast du den Vorteil das du einen HTTP-Server sehr bequem implementiert hast.
Wobei die Sache mit den Servlets am Anfang nen ganz schönes Gefrickel ist^^

Wenns einmal läuft kannst du einfach ein Servlet machen mit
Java:
extends HttpServlet
und kannst das Methoden wie doGet (wird aufgerufen bei einem GET-Request) und getPost (analog) benutzen (und noch einige weitere).

Gruß
Tobias
 
Moin moin,

also eigentlich wollte ich auf sowas wie TomCat verzichten und rein mit Java arbeiten. Hab gestern mal n bissl mit Sockets rumgespielt, irgendwie war da immer der Wurm drinne ^^
Naja gut, das war erstmal auf Consolen-Ebene, aber die Idee, die dahinter steckt, müsste ja an sich die selbe sein.

Hast du vll. einen Link, wo sowas ein bisschen beschrieben wird? Der, der hier im Forum rumfliegt, geht irgendwie nicht mehr -.-

Grüße Flo
 
Also zum Thema Sockets/ServerSockets kann ich dir http://www.galileocomputing.de/open...sel16_007.htm#Rxx747java160070400063A1F03F100 empfehlen..
Ich hab aus Spaß auch schon mal einen (sehr begrenzten) Webserver geschrieben, das wichtigste mal hier (gekürzt - so nicht direkt lauffähig ;)):

Java:
public class HttpServer
{
  private ServerSocket sock;
  private boolean listen = true;

  public HttpServer()
  {
    try
    {
      sock = new ServerSocket( 80 );

      while( listen )
      {
        new RequestHandler( sock.accept() ).start();
      }

      sock.close();

    }
    catch ( IOException ex )
    {
      ex.printStackTrace();
    }
  }
}
Java:
class RequestHandler extends Thread
{
  private Socket socket;
  private InputStream in;
  private OutputStream out;

  private String HOST_ADDRESS = "http://localhost";

  private String htmlResponse =
      "HTTP/1.0 200 OK\r\n" +
      "Server: " + "My Web Server 0.1b\r\n" +
      "Content-Type: text/html\r\n" +
      "Cache-Control: no-cache\r\n" +
      "Pragma: no-cache\r\n" +
      "Connection: close\r\n\r\n";

  private String cssResponse =
      "HTTP/1.0 200 OK\r\n" +
      "Server: " + "My Web Server 0.1b\r\n" +
      "Content-Type: text/css\r\n" +
      "Cache-Control: no-cache\r\n" +
      "Pragma: no-cache\r\n" +
      "Connection: close\r\n\r\n";

  public RequestHandler( Socket sock, WinampMediaLibrary lib ) throws IOException
  {
    socket = sock;
    in = sock.getInputStream();
    out = sock.getOutputStream();
  }


  public void run()
  {
    try
    {
      byte[] buf = new byte[1024];
      int len;
      StringBuffer strBuf = new StringBuffer();
      socket.setSoTimeout( 200 );

      try
      {
        while ( ( len = in.read( buf ) ) > 0 )
        {
          strBuf.append( new String( buf, 0, len ) );
        }
      }
      catch ( SocketTimeoutException ex1 )
      {
        //nix
      }
      String[] req = strBuf.toString().split("\r\n");
      String firstLine[] = req[0].split( " " );

      //Mal den kompletten Reqest zu Testzwecken ausgeben
      System.out.println( strBuf.toString() );
      //Hier den Request weiterverarbeiten
    }
}

//Methode zum Senden einer Datei vom Server an den Client
//filename = Dateiname auf dem Server
//header = benötigter HTTP Response Header (für jede Datei unterschiedlich - Bsp. css Header siehe oben
//req[] wird benötigt, falls Client nur einen Teil der Datei anfordert (s. HTTP Spezifikation)
  private void sendFile( String filename, String header, String req[] ) throws IOException
  {
    String firstLine[] = req[0].split( " " );
    InputStream in = new FileInputStream( filename );

    out.write( header.getBytes() );

    byte[] buf = new byte[1024];
    int len;

    //Seekable machen
    long skip = getStartOffset( req );
    in.skip( skip );

    while ( ( len = in.read( buf ) ) > 0 )
    {
      out.write( buf, 0, len );
    }
  }

  private long getStartOffset( String[] ar )
  {
    for ( int i = 0; i < ar.length; i++ )
    {
      if( ar[i].startsWith( "Range: ") )
      {
        String afterEqual = ar[i].split("=")[1];
        return Long.parseLong( afterEqual.split("-")[0] );
      }
    }
    return 0;
  }

Dazu noch interessant die HTTP Specs: http://www.mathematik.uni-ulm.de/sai/ss02/soft/blatt7/rfc2616.txt (Bissel lang ich weiß ;)) Ist meist einfacher nach Sachen wie HTTP Request und HTTP Response zu googlen (oder mal hier gucken: http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol). Kannst dir auch erstmal angucken wie die Requests aussehen die ein Browser so sendet^^

Gruß
Tobias
 
Zuletzt bearbeitet:
Zurück