[Java] http-Webserver in Java

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Mazen2004, 3. Februar 2011 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 3. Februar 2011
    http-Webserver in Java

    ich hab nen webserver der wenn er läuft die index.html anzeigen soll.


    Code:
    public static String fileName;
    public static ServerSocket webL = null;
    
    public static OutputStream connectReady() throws IOException {
    
     // connect, readInput and return outputstream
    
     if (webL == null) {
     webL = new ServerSocket(80);
     }
    
     Socket socket = webL.accept();
     InputStream is = socket.getInputStream();
    
     BufferedReader reader = new BufferedReader(new InputStreamReader(is));
     String line = reader.readLine();
     while (!line.isEmpty()) {
     if (line.startsWith("GET") == true) {
     fileName = line.substring(5, line.length() - 9);
     }
     System.out.println(line);
     line = reader.readLine();
     }
    
     OutputStream os = socket.getOutputStream();
     return os;
    
     }
    
     public static void readWrite(String fileName, OutputStream os) throws IOException {
    
     File myFile = new File(fileName);
     FileInputStream in = new FileInputStream(myFile);
    
     BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    
     int c = 0;
    
     while (c != -1) {
     os.write(c);
     c = reader.read();
     } 
     }
    
     public static void main(String[] args) throws IOException {
     OutputStream os = connectReady();
     try {
     readWrite("./data/index.html", os);
     }
     catch (IOException ex) {
     deliver404(os); // wenns halt nicht klappt gibts einen 404 error
     }
     os.close();
     }
    
    
    

    wie muss ich das denn ändern, damit der webserver mehrere Anfragen beantworten kann?
     
  2. 3. Februar 2011
    AW: webserver

    Code:
    while ((Socket socket = webL.accept() != null){
     // starte hier deinen server thread, also erstelle nen thread
     // der die arbeit übernimmt. also musst du dazu nen nen
     // runnable interface implementieren, hier nen neues
     // objekt davon erstellen und es starten.
     // damit das ganze auch richtig läuft solltest du
     // den socket mitgeben.
    }
    
    Etwas konkreter:

    Code:
    while ((Socket socket = webL.accept() != null){
     new Thread(new webServer(socket)).start();
    }
    
    public class webServer extends Thread {
     public webServer(Socket client){
     this.client = client;
     }
     // Deklarationen, Methoden usw hier
    
     public void run() {
     out = new PrintWriter(client.getOutputStream(), true);
     in = new BufferedReader(new InputStreamReader(client.getInputStream()));
    
    
     while ((fromClient = in.readLine()) != null) {
     // Handle hier die requests usw ab
     }
     } 
    }
    
    Edit: Ich erachte den Ansatz mit Threads als weitaus sinnvoller, bzgl mehrere clients. Vorallem weil man gegebenfalls irgendwann mal Session States einführen muss usw. Das geht nicht wenn alles im selben Thread läuft. Genauso ist ohne Threads immernoch nur ein Socket verbunden (es wird ja nur einmal eine Verbindung akzeptiert).

    Off topic:
    Davon abgesehen dass das komplette Design des webServers eher "komisch" ist
     
  3. 3. Februar 2011
    AW: webserver

    Code:
    public static String fileName;
    public static ServerSocket webL = null;
    
    public static OutputStream connectReady() throws IOException {
    
     // connect, readInput and return outputstream
    
     if (webL == null) {
     webL = new ServerSocket(80);
     }
    
     Socket socket = webL.accept();
     InputStream is = socket.getInputStream();
    
     BufferedReader reader = new BufferedReader(new InputStreamReader(is));
     String line = reader.readLine();
     while (!line.isEmpty()) {
     if (line.startsWith("GET") == true) {
     fileName = line.substring(5, line.length() - 9);
     break;
     }
     System.out.println(line);
     line = reader.readLine();
     }
    
     OutputStream os = socket.getOutputStream();
     return os;
    
     }
    
     public static void readWrite(String fileName, OutputStream os) throws IOException {
    
     File myFile = new File(fileName);
     FileInputStream in = new FileInputStream(myFile);
    
     BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    
     int c = 0;
    
     while (c != -1) {
     os.write(c);
     c = reader.read();
     } 
     }
    
     public static void main(String[] args) throws IOException {
     while(true){
     OutputStream os = connectReady();
     try {
     readWrite(fileName, os);
     }
     catch (IOException ex) {
     
     }
     os.close();
     }
     }
    

    Die Dateien müssen direkt im root Verzeichnis des Projektordners sein

    Halt deine Methode mit quick and dirty ^^, wie mein Vorposter schon sagt mit Thread arbeiten
     
  4. 3. Februar 2011
    AW: webserver

     
  5. 3. Februar 2011
    AW: webserver

    Dann frag ich mal so: Was sind denn mehrere Anfragen ? Mehrere Clients oder mehrere GET-Anfragen ?
     
  6. 3. Februar 2011
    AW: webserver

    Ich hab nämlich auch mehre Get Anfragen gestanden ..
     
  7. 3. Februar 2011
    AW: webserver

    Ich denke rauszufinden was die eigentliche Aufgabe ist, bekommst du selbst hin. Wenn nicht, dann musst du das trotzdem selbst hinbekommen. Ich denke hier helfen die Leute (ich zumindest) gerne, aber nicht um Hausaufgaben zu machen. Weil bevor ich hier dann anfang "richtig" zu arbeiten kann ich auch an meinen eigenen Abgaben/Projekten/Aufgaben arbeiten

    Edit:
    Also formulier doch mal das Problem so, damit es keine Missverständnisse gibt, und danach gucken wir weiter, wie mans lösen könnte.
     
  8. 3. Februar 2011
    AW: webserver

    ok hab soweit jetzt auch alles lösen können

    neues Problem :

    Ich hab den Webserver nun am laufen und er öffnet mir eine html seite. Dort läuft ein javascript und man kann einen namen eingeben und auf einen button drücken.

    Nach Buttondruck steht in der Console: GET /%eingegebener Name HTTP/1.1

    Wie kann ich denn nun auf den Namen in Java zugreifen? Ich muss doch mit nem buffered reader die get zeile auslesen.

    Aber wo wende ich den buffered reader an?

    EDIT:

    normalerweise doch da wo ich auch die anderen get bearbeite also hier:

    Code:
    if (webL == null) {
     webL = new ServerSocket(80);
     }
    
     Socket socket = webL.accept();
     InputStream is = socket.getInputStream();
    
     BufferedReader reader = new BufferedReader(new InputStreamReader(is));
     String line = reader.readLine();
     while (!line.isEmpty()) {
     if (line.startsWith("GET") == true) {
     fileName = line.substring(5, line.length() - 9);
     }
     System.out.println(line);
     line = reader.readLine();
     }
    
    nur ich darf da nicht weiter reinkritzeln -.-
     
  9. 3. Februar 2011
    AW: webserver

    Was ist jetzt damit genau gemeint, tut mir leid wenn ich grad auf dem Schlauch steh aber ich weiß nicht wirklich auf was du jetzt hinaus willst.
     
  10. 3. Februar 2011
    AW: webserver

    ich bin auch zu bescheuert um es zu erklären ^^

    Der Server läuft und ich muss die Button Anfrage bearbeiten.

    Dazu habe ich folgenden Code geschrieben, weil ich den obigen nicht mehr ändern darf:

    Code:
    Socket socket = webL.accept(); // der webL von oben, der auch die erste get anfrage bearbeitet
     InputStream is = socket.getInputStream();
    
     String artist = null;
    
     BufferedReader reader = new BufferedReader(new InputStreamReader(is));
     String line = reader.readLine();
     while (!line.isEmpty()) {
     if (line.startsWith("GET /%")) {
     artist = line.substring(6, line.length() - 9);
     }
     line = reader.readLine();
     }
    
     
  11. 3. Februar 2011
    AW: webserver

    Standard String operationen in java ?
    Guck deinen Code an, oder debugge ihn. Wenn auf der konsole was ausgegeben wird, dann muss es vorher auch irgendwo drinstehen. Also debugge und guck wo die Ausgabe kommt, und welche Variable das ist.
    Mit der Variable kanste dann weiterarbeiten.

    Tipp:
    Spoiler
    System.out.println(line);

    Edit: Da hast du das doch schon....

    Code:
    if (line.startsWith("GET /%")) {
     artist = line.substring(6, line.length() - 9);
     }
    
    Was mag wohl in artist stehen ?
     
  12. 3. Februar 2011
    AW: webserver

    Beim ersten Post sah der abschnitt noch anders aus ^^

    Aber dennoch, hatte ich in meinem ersten Post das thema schon behandelt

    fileName = artist;

    dannach machst ein Break weil du ja das Get schon hast.(Natürlich nicht wenn du mehr brauchst)
     
  13. 3. Februar 2011
    AW: webserver

    MAAAAAAAAANNNNNNNNNNNNNNNNNNNNNNNNnnn

    ich hab alles soweit hinbekommen jetzt....

    Nur das hier nicht:

    Code:
    public static void readWrite(String fileName, OutputStream os) throws IOException {
    
     File myFile = new File(fileName);
     FileInputStream in = new FileInputStream(myFile);
    
     BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    
     int c = 0; 
     while (c != -1) {
     c = reader.read();
     os.write(c);
     } 
     System.out.println("ende"); // das habe ich eingefügt um den Fehler zu finden!
     }
    
     /**
     * @param args
     */
     public static void main(String[] args)throws IOException {
     // Read from a file
     readWrite("./data/index.html", System.out);
     }
    
    er liest die index.html aus und gibt sie im System.out aus.... doch das Ergebnis ist das hier:


    wie bekomme ich das zeichen da weg und wo kommt das her?!
     
  14. 3. Februar 2011
    AW: http-Webserver in Java

    Das ÿ entspricht der Zahl 255 oder auch -1.
    Und da deine Abfrage nach der Ausgabe kommt wird das noch ausgegeben.

    Einfach das

    Code:
    int c = 0; 
    while (c != -1) {
     c = reader.read();
     os.write(c);
    }
    in
    Code:
    int c = reader.read(); 
    while (c != -1) {
     os.write(c);
     c = reader.read();
    }
    
    ändern.

    Mfg Rushh0ur
     
  15. 3. Februar 2011
    AW: http-Webserver in Java

    yeahhh thanks an alle hab soeben abgeben. Der 1.0 steht nichts mehr im Weg.

    Hab auch gleich gesagt, dass hoffentlich beim nächsten Mal weniger Vorgaben da sind damit ich threads usw benutzen kann und alles selbst schreiben kann....

    Bewertungen gehen raus!
     
  16. 4. Februar 2011
    AW: http-Webserver in Java


    seit wann wird hier jemandem bei hausaufgaben geholfen?
     
  17. 6. Februar 2011
    AW: http-Webserver in Java

    Seit dem die Leute zu langsam zum melden / die Mods zu langsam zum closen sind. Man konnte es auch nicht direkt aus dem ersten Post ersehen.
     
  18. 6. Februar 2011
    AW: http-Webserver in Java

    die Hausaufgabe hab ich doch zu 95% schon fertig gehabt. Das einzige Problem war das mit dem extrazeichen! Und da wurde mir geholfen.

    Ist ja nicht so, dass hier jm. die Hausaufgaben für mich schreibt tz

    ich mach hier mal zu
     
  19. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.