Netwerkprogrammierung und Http Server

werdas34

Bekanntes Mitglied
Hallo,

meine Aufgabe lautet, einen Client und Server zu schreiben. Der Client schickt dem Server ne Datei und der Server schickt dann den Inhalt leicht modifiziert zurück - heißt: Die Anzahl der Zeichne im String - so oft wird er ausgeben und mit einem Symbol am Anfang und Ende ergänzt. Das Ergebnis schreibt der Client in die Konsole.
Bsp:
Hallo
xHallox
xHallox
xHallox
xHallox
xHallox
Soweit funktioniert es auch, nur er liest nur die erste Zeile meiner Datei ein.
Weitere Zeilen werden ignoriert. Warum? Was ist faslch?
Code:
public class KingslakeClient {
    public static void main(String[] arg) throws Exception {
    //    String[] args = { "Hallo"};
        try (Socket socket = new Socket("localhost", 57777);
                BufferedReader from = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintWriter to = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()))) {
           
    //        to.println(args[0]);
    //        to.flush();
            List<String> lines = Files.readAllLines(Paths.get("Graph.txt"));
            for(int i = 0; i < lines.size(); i++) {
                to.println(lines.get(i));
                to.flush();
            }
           
            String str = "";
            while(!str.equals("\0")) {
                str = from.readLine();
                System.out.println(str);
            }
        }
    }

}
public class KingslakeServer {
   public static void main(String[] arg) throws Exception {
       try (ServerSocket server = new ServerSocket(57777)) {
           boolean acceptRequests = true;
           while (acceptRequests) {
               Socket socket = server.accept();
               new Thread() {
                   public void run() {
                       String[] args = { "x" };
                       try (InputStream is = socket.getInputStream();
                               Reader r = new InputStreamReader(is);
                               BufferedReader from = new BufferedReader(r);
                               OutputStream o = socket.getOutputStream();
                               Writer w = new OutputStreamWriter(o);
                               PrintWriter to = new PrintWriter(w)) {

                           String input = from.readLine();
                           for (int i = 0; i < input.length(); i++) {
                               to.println(args[0] + input + args[0]);
                               to.flush();
                           }
                           to.println("\0");
                           to.flush();
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }
               }.start();
           }

       }
   }
}

Bei meiner nächsten Aufgabe soll ich einen Webserver schreiben.
Wenn ich den Typ HttpServer verwende, dann kommt die Meldung das HttpServer nicht existiert - man solleden Typ selbst definieren.
Nur finde ich nichts im Web, wie oder was ich tun muss, damit das funktioniert. Habe sogar ganze Beispiele mit HttpServer aus dem Netz kopiert und getestet, aber da funktioniert auch nichts.
Installiert ist Java 8.

thx
mfg werdas34
 

werdas34

Bekanntes Mitglied
Danke.
Ist es normal das in Eclipse HttpServer usw nicht erkannt werden bzw. der Compiler sagt da fehlt was?
Mir werden lauter Fehler angezeigt, aber der Code funktioniert.

Schau mal genau hin, wie oft readLine() in Deinem Server ausgeführt wird...
Ich hatte zuvor eine Schleife, die das hätte lösen sollen aber mit from.ready() als Bedingung, was im Nachhinhein keinen Sinn macht.
Jetzt funktioniert es aber.
 

werdas34

Bekanntes Mitglied
Sag doch immer bitte, welche Fehler ganz ganz genau und wo genau und mit dem ganz genauen Wortlaut.
Multiple markers at this line
- Access restriction: The method 'HttpServer.create(InetSocketAddress, int)' is not API (restriction on required library 'C:\Program
Files\Java\jre-10.0.2\lib\jrt-fs.jar')
- Access restriction: The type 'HttpServer' is not API (restriction on required library 'C:\Program Files\Java\jre-10.0.2\lib\jrt-fs.jar')
- Access restriction: The type 'HttpServer' is not API (restriction on required library 'C:\Program Files\Java\jre-10.0.2\lib\jrt-fs.jar')

Und das bei allen Teilen mit HttpServer usw.
Aber es lässt sich compilieren und ausführen und funktioniert auch.

Ich soll mit dem Webserver eine Map füllen.
Funktioniert soweit auch ganz gut, nur wenn ein zweiter Eintrag kommt, dann erstellt er mir eine neue map. Zumindest sind die Einträge von vorhin nicht da.
Warum?

Code:
public class EmbeddedServer {

    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(5000), 0);
        server.createContext("/", new MyHandler());
        server.start();
    }

    static class MyHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange t) throws IOException {
            Map<String, String> map = new HashMap<>();
            String httpMethod = "";
            while (httpMethod != null) {
                httpMethod = t.getRequestMethod();
                String[] resource = t.getRequestURI().toString().split("/");

                if (httpMethod.equalsIgnoreCase("post")) {
                    if (!map.containsKey(resource[2].trim())) {
                        map.put(resource[2].trim(), resource[3].trim());
                        t.sendResponseHeaders(201, 1);
                    } else {
                        t.sendResponseHeaders(409, 1);
                    }
                }
                System.out.println(map.entrySet());
            }
        }
    }
}
 

httpdigest

Top Contributor
Deine Map `Map<String, String> map = new HashMap<>();` ist eine lokale Variable innerhalb der Methode, die jedesmal bei jedem Request aufgerufen wird. Mache daraus z.B. ein Instanzfeld/eine Instanzvariable.

Und was soll denn bitte die while-Schleife?? `while (httpMethod != null)...`
 

mihe7

Top Contributor
Bei den Meldungen dürfte es sich um Warnungen handeln, weil der HttpServer nicht Teil der Standard-Java-API ist und somit nicht sichergestellt ist, dass der Code unter allen Java-Implementierungen funktioniert.

Bislang war das recht einfach erkennbar, und das dürfte sich auch nicht geändert haben: Klassen, deren FQN mit com.sun. beginnt, sind nicht Teil der Standard API.
 

werdas34

Bekanntes Mitglied
Und was soll denn bitte die while-Schleife?? `while (httpMethod != null)...`
Ich brauche eine Schleife, denn sonst wird bei jeder neuen Sitzung eine neue Map erstellt.
Die Bedingung könnte besser sein, das meinst du sicher. Da bin ich noch am überlegen wie ich das mache.
Bei den Meldungen dürfte es sich um Warnungen handeln, weil der HttpServer nicht Teil der Standard-Java-API ist und somit nicht sichergestellt ist, dass der Code unter allen Java-Implementierungen funktioniert.

Bislang war das recht einfach erkennbar, und das dürfte sich auch nicht geändert haben: Klassen, deren FQN mit com.sun. beginnt, sind nicht Teil der Standard API
Soweit war ich auch schon. Nur sind die Warnungen sehr verwirrend, vorallem wenn man davon ausgeht, dass das Programm nun nicht mehr compiliert, wegen den Warnungen.
Aber da fehlt mir wahrscheinlich die Erfahrung.
 

httpdigest

Top Contributor
Ich brauche eine Schleife, denn sonst ...[unsinniger Grund].
Nein, brauchst du nicht. Die Schleife führt tatsächlich zu einer IOException, weil du mehrmals hintereinander sendResponseHeaders aufrufst und beim zweiten Mal kracht's. Und die Exception sorgt dann dafür, dass es keine Endlosschleife ist - was es normalerweise nämlich wäre.
Mach es einfach so:
Java:
public class EmbeddedServer {
  public static void main(String[] args) throws Exception {
    HttpServer server = HttpServer.create(new InetSocketAddress(5000), 0);
    server.createContext("/", new MyHandler());
    server.start();
  }
  private static class MyHandler implements HttpHandler {
    private static final int CREATED = 201;
    private static final int CONFLICT = 409;
    private final Map<String, String> map = new HashMap<>();
    @Override
    public void handle(HttpExchange t) throws IOException {
      String httpMethod = t.getRequestMethod();
      if ("POST".equalsIgnoreCase(httpMethod)) {
        String[] resource = t.getRequestURI().toString().split("/");
        if (!map.containsKey(resource[2].trim())) {
          map.put(resource[2].trim(), resource[3].trim());
          t.sendResponseHeaders(CREATED, 0);
        } else {
          t.sendResponseHeaders(CONFLICT, 0);
        }
      }
      t.close();
      System.out.println(map.entrySet());
    }
  }
}
 

mihe7

Top Contributor
man davon ausgeht, dass das Programm nun nicht mehr compiliert, wegen den Warnungen.
Warnung = wird kompiliert, Fehler = wird nicht kompiliert.
Ich brauche eine Schleife, denn sonst wird bei jeder neuen Sitzung eine neue Map erstellt.
HTTP kennt keine Sitzungen. Der Client schickt einen Request, der Server verarbeitet diesen, Antwortet darauf und das Thema ist erledigt. Bis zur Einführung von HTTP 1.1 (EDIT: 1.1 ist falsch, man konnte bereits mit HTTP 1.0 die Verbindung aufrecht erhalten) war es sogar notwendig, für jeden Request eine neue Verbindung aufzubauen.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Rest- Api mit HTTP BASIC Authentication Java Basics - Anfänger-Themen 16
L Webseite aufrufen (HTTP) Java Basics - Anfänger-Themen 8
P Maven-Dependencies (package org.apache.http.nio does not exist) Java Basics - Anfänger-Themen 6
S XML mittels HTTP Get Anfrage Java Basics - Anfänger-Themen 4
R HTTP-Links in Java Class finden Java Basics - Anfänger-Themen 3
P Http Header, Http Proxy Java Basics - Anfänger-Themen 19
W HTTP-Stream auf Ajax umbauen Java Basics - Anfänger-Themen 7
F Http Post von mehreren Daten Java Basics - Anfänger-Themen 5
K URL ohne http:// Java Basics - Anfänger-Themen 8
F HTTP Get Queue Java Basics - Anfänger-Themen 7
J HTTP Request auf eine PHP Session Java Basics - Anfänger-Themen 1
E HTTP Client - Login durchführen? Java Basics - Anfänger-Themen 4
T Input/Output HTTP 403 aber im Browser gehts Java Basics - Anfänger-Themen 2
G Kraken HTTP Sniffer: ExceptionInInitializerError (Nutzt JNI) Java Basics - Anfänger-Themen 2
O get HTTP Headers Java Basics - Anfänger-Themen 5
L Methodenzerlegung HTTP Java Basics - Anfänger-Themen 4
S HTTP Adresse von offenem Browserfenset einlesen Java Basics - Anfänger-Themen 6
C HTTP POST-Request Java Basics - Anfänger-Themen 3
G http-Port beim Apache Tomcat ändern Java Basics - Anfänger-Themen 1
G HTTP Server Java Basics - Anfänger-Themen 2
S HTTP Request Umlaut Problem Java Basics - Anfänger-Themen 3
N Http-Request : Google Suche Java Basics - Anfänger-Themen 6
G http-Request auf Apache Tomcat Java Basics - Anfänger-Themen 13
G HTTP Body? Java Basics - Anfänger-Themen 4
A HTTP-Request Java Basics - Anfänger-Themen 15
K Problem mit javax/servlet/http/HttpServletRequest.java Java Basics - Anfänger-Themen 2
J Mehrdimensionales Array im Http-Request Java Basics - Anfänger-Themen 5
M Http Redirect Java Basics - Anfänger-Themen 5
M HTTP-Anfragen und Socket Java Basics - Anfänger-Themen 2
T mit einem string der form"[url]http://www.*.*/*"[/url] datei Java Basics - Anfänger-Themen 3
J HTTP Request Auslösen Java Basics - Anfänger-Themen 2
P HTTP-Request Parameter übergeben Java Basics - Anfänger-Themen 8
G http client Java Basics - Anfänger-Themen 4
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
K Verständnisproblem bei Server/Client Java Basics - Anfänger-Themen 3
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
FireHorses Benutzernamen aus PrivateChannel(Interaction) auf Server bringen Java Basics - Anfänger-Themen 0
HolyFUT Best Practice Architektur WebSocket Server Java Basics - Anfänger-Themen 1
S Server Java Basics - Anfänger-Themen 4
S Server Java Basics - Anfänger-Themen 3
D Verbesserungsvorschläge zur Struktur einer Client Server Desktop Chat App Java Basics - Anfänger-Themen 24
D Unerwartetes Verhalten bei Client Server Chat App Java Basics - Anfänger-Themen 12
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
M CS GO Server mit Java steuern Java Basics - Anfänger-Themen 3
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
B DHCP-Server Adresse ermitteln Java Basics - Anfänger-Themen 4
A Client-Server Kommunikation Java Basics - Anfänger-Themen 3
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
R Antwort vom Server an mehreren Clients senden Java Basics - Anfänger-Themen 3
S Server - für jeden Client ein Serverthread Java Basics - Anfänger-Themen 2
G sql server connection mit windows authentication Java Basics - Anfänger-Themen 2
N Erste Schritte Dedicated Server \ Senden und Empfangen von Daten/Befehlen Java Basics - Anfänger-Themen 2
L Erste Schritte Erste Versuche mit Server und Client Java Basics - Anfänger-Themen 7
elischa Client-Server IO und Stream Steuerung ? Java Basics - Anfänger-Themen 2
U Erste Schritte Server will nicht übergebenes Objekt speichern Java Basics - Anfänger-Themen 5
B IP Adresse von Wildfly Server Java Basics - Anfänger-Themen 1
cezary Server läßt sich nicht starten Java Basics - Anfänger-Themen 2
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
I Print Client -> Server -> Client? Java Basics - Anfänger-Themen 1
I lokales Programm mit Client/Server Programm kommunizieren Java Basics - Anfänger-Themen 3
H java.lang.NoClassDefFoundError Run as>> Run on Server Java Basics - Anfänger-Themen 2
F String zu einem Server senden Java Basics - Anfänger-Themen 4
N Server Zeit zur lokalen Zeit setzen. Java Basics - Anfänger-Themen 0
J TCP MultiThreaded Server und Client - irgendwo ist der Fehler, aber ich find ihn nicht Java Basics - Anfänger-Themen 3
I ical - Datei auf Server ablegen und Kalender abbonieren Java Basics - Anfänger-Themen 0
T Eclipse - GlassFish Server!? Java Basics - Anfänger-Themen 1
I Java Server Faces mit Glassfish Webseite veröffentlichen Java Basics - Anfänger-Themen 4
M Input/Output tcp-Server mit statischer Parallelität Java Basics - Anfänger-Themen 7
G Multiple Clients and one Server Java Basics - Anfänger-Themen 2
K Java Client > Python Server Java Basics - Anfänger-Themen 0
F jabva 7.21 läuft nicht auf windows server 2012? Java Basics - Anfänger-Themen 9
D Socket ---> Server Socket worauf muss ich achten? Java Basics - Anfänger-Themen 2
S Java - Client/Server mit Stomp kurze Frage Java Basics - Anfänger-Themen 0
I JDK SERVER -jar stoppen Java Basics - Anfänger-Themen 5
Screen Wie Propertydatei im Server beschreiben? Java Basics - Anfänger-Themen 7
K threaded server Java Basics - Anfänger-Themen 18
E Client Server Java Basics - Anfänger-Themen 12
Q Datenbank nicht über separaten Server Java Basics - Anfänger-Themen 4
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
L Chat server Java Basics - Anfänger-Themen 4
O Server Client Problem Java Basics - Anfänger-Themen 2
B Java Server Side Java Basics - Anfänger-Themen 14
H Java Server/Client, HTML Seite anzeigen Java Basics - Anfänger-Themen 2
L Server pingt Client und fordert Info Java Basics - Anfänger-Themen 2
G JObjekte dynamisch vom Server erzeugen lassen Java Basics - Anfänger-Themen 4
A Server logs auslesen Java Basics - Anfänger-Themen 6
Z Threads, Server, GUI Java Basics - Anfänger-Themen 4
R Server/Client für Spiel Java Basics - Anfänger-Themen 2
M Java class auf Server starten Java Basics - Anfänger-Themen 5
U Java-Programm auf einem Server starten Java Basics - Anfänger-Themen 33
D Java Applet Dateien auf Server auslesen? Java Basics - Anfänger-Themen 8
X Applet - Client/Server Java Basics - Anfänger-Themen 2
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
N Methoden Test ob Server vorhanden ist Java Basics - Anfänger-Themen 4
S .Bat Server von .java Starten Java Basics - Anfänger-Themen 5
L Server mit mehreren Clients Java Basics - Anfänger-Themen 25
L Bild versenden über Client/Server Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben