Netzwerkprogrammierung Anfang

Toaster-X

Mitglied
Hallo, ich bin nun im letzten Schuljahr an einem Gymnasium und eines unserer letzten Themen in den Programmieranfängen ( bevor es zu Androidprogrammierung geht) ist nun die Netzwerkprogrammierung.
Letztes Jahr habe ich noch alles gut verstanden ( bestätigte sich durch 14 Punkte im Zeugnis ), doch nun haben wir einige Aufgaben bekommen, die wir lösen sollen, allerdings bin ich damit überfordert, da wir uns das meiste selbst erarbeiten sollten.
Für die erste Aufgabe hat uns der Lehrer bereits eine Lösung gegeben, wobei ich aus dem Quelltext nicht wirklich schlauer werde und somit auch in den Aufgaben nicht weiterkomme.

Die 1. Aufgabe war schlichtweg man solle im Clientprogramm eine Zahl eingeben und im Serverprogramm überprüfen lassen ob es sich dabei um eine Primzahl handelt. Dafür gibt es auch Lösungen und ich wollte fragen, ob mir jemand den Quelltext erklären könnte, und mir die Zusammenhänge zw. Server und Clientprogramm erklären, damit ich die anderen Aufgaben bearbeiten kann.
(Bsplaufgaben die ich noch machen muss:
2.) Der Server soll auf Anfrage eine Primzahl generieren und an den Client schicken
4.) Egänze ein Programm so, dass alle Verbindungsinfos angrzeigt werden
5.) Echoserver
8.) Chatprogramm
)
Ich scheitere allerdings ja schon an der 2. Aufgabe da ich die Lösung von 1.) nicht verstanden habe.

Deshalb würde ich mich über eure Hilfe freuen! Danke im Vorraus 🙂

Bild 1 zeigt das Clientprogramm
Bild 2 den Anfang des Servers und wie die Zahl auf eine Primzahl untersucht wird
Bild 3 ist dann das Serverprogramm

Danke!
 

Anhänge

  • 15397054577913333140800670896799.jpg
    15397054577913333140800670896799.jpg
    2,4 MB · Aufrufe: 44
  • 15397055005581123389389661284633.jpg
    15397055005581123389389661284633.jpg
    2,8 MB · Aufrufe: 57
  • 15397055434023359789000369468231.jpg
    15397055434023359789000369468231.jpg
    2,4 MB · Aufrufe: 51
Poste den Code doch als Code ([code=java]...der Code...[/code]) und nicht als Bild, das erleichtert allen die Hilfe deutliche 😉

(und der Code kommt wirklich von jemandem, der Programmieren beibringen soll?)
 
Was verstehst Du denn nicht?

Übrigens: du kannst hier auch Quellcode einstellen, wenn Du ihn in [code=Java]...[/code] einschließt.
 
Okay, ich hoffe dass es klappt, danke nochmals 🙂
Java:
import java.net.*;
import java.io.*;
public class Primzahl1Client {
  public static void main(String[] args) throws IOException {
    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Bitte geben Sie die gewünschte Zahl ein: ");
    int zahl = Integer.parseInt(stdin.readLine());
    System.out.println("Die Zahl wird nun an den Server übermittelt und geprüft.");
    
    String host = "localhost";
    int port = 33333;
    try {
      Socket sock = new Socket(host, port);
      OutputStreamWriter out = new OutputStreamWriter(sock.getOutputStream());
      out.write(zahl +"\r\n");
      out.flush(); 
     
      InputStream antwort = sock.getInputStream();
      BufferedReader sin = new BufferedReader(new InputStreamReader(antwort));
      String aw = sin.readLine();
      System.out.println(aw);
      sock.close();
    } catch (UnknownHostException uhe) {
      System.err.println(uhe);
    } catch (IOException ioe) {
      // kein Server, dann IOException
    }
  }  // end main 
}  // end
Das Clientprogramm
Java:
import java.net.*;
import java.io.*;
import java.util.*;
public class Primzahl1Server {
  /**
  * Methode um Primzahlen zu testen.
  * @param eingabewert: Zahl die auf Primzahl getestet werden soll
  * @return true (ist Primzahl); false (ist keine Primzahl)
  */
  
  public static boolean isPrimzahl(int eingabewert){
    int ergebnis;
    boolean isPrimzahl = true;
    int i=eingabewert;
    for (int j= eingabewert; j>1; j--){
      i= i-1;
      ergebnis = eingabewert % i;
      if ((ergebnis==0)&&(i!=1)) {
        isPrimzahl = false;
      }
    }
    return isPrimzahl;
  }
  
  public static void main(String[] args) throws IOException {
    String host = "localhost";
    int port = 33333;
    ServerSocket server = new ServerSocket(port);
    Socket connection = null;
    
    while (true) {
      System.out.println("Warte auf Verbindungen.");
      connection = server.accept();
      InputStream anfrage = connection.getInputStream();
      BufferedReader sin = new BufferedReader(new InputStreamReader(anfrage));
      int zahl = Integer.parseInt(sin.readLine());
      System.out.println("Die Zahl " + zahl + " wurde vom Client " + connection.getInetAddress() + " port " + connection.getPort() + " empfangen und wird nun geprüft");
      boolean ergebnis = isPrimzahl(zahl);
      OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
      if (ergebnis == true) {
        System.out.println("Die Zahl " + zahl + " ist eine Primzahl. \r\n");
        out.write("Die Zahl " + zahl + " ist eine Primzahl. \r\n");
      } // end of if
      else{
        System.out.println("Die Zahl " + zahl + " ist keine Primzahl. \r\n");
        out.write("Die Zahl " + zahl + " ist keine Primzahl. \r\n");
      }
      out.flush();
      System.out.println("Ergebnis wurde übermittelt - Verbindung wird getrennt. \r\n");      
      connection.close();
    }
  }  // end main 
}  // end
 
Wie mihe schon sagte: Was sind denn konkret deine Fragen?

Die print-Ausgaben des Programms beschreiben ja mehr oder weniger fast jede Zeile 😉
 
Um es aber nochmals zu konkretisieren:
Das Clientprogramm erscheint mir soweit logisch, allerdings habe ich beim Serverprogramm Probleme:

Das InputStream anfrage bedeutet, vermute ich mal, dass das eingetippte im Client empfangen wird und ausgewertet werden kann.

Die nächste Zeile widerrum verstehe ich nicht, da ich nicht verstehe wieso man einen neuen BufferedReader (nicht stdin) braucht und wofür er gut ist und damit in Verbindung verstehe ichauch die darauffolgende Zeile nicht.
Das boolean ergebnis ist denke ich die Überprüfung ob das Eegebnis eine Primzahl ist?

out.write bedeutet denke ich dass diese Zeile im Client ausgegeben werden soll und out.flush sendet es ab und zum Schluss wirddie Verbindung wieder geschlossen.

Aber wo wurde jetzt die Zahl die vom Client kommt überprüft? Weil ich den Primzahltest nicht ganz verstehe ( Hatte der Lehrer uns als Hilfestellung gegeben damkt wir das nicht selbst machen müssen.

Hoffe das nun klarer ist wobei ich Hilfe brauche
 
Der Inputstream, der aus der connection gezogen wird, enthält die Daten, die vom Client kommen. Aus dem Inputstream möchtest du die Zahl auslesen, die der Client gesendet hat.
Jetzt bietet ein InputStream selbst aber keine einfache Methode an, um etwa eine ganze Zeile zu lesen.
https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html

Über den InputStream kannst du nur einzelne bzw. eine bestimmte Anzahl von Bytes lesen.

Um das komfortabler zu gestalten, wird der InputStream "eingepackt".
Zuerst wird der InputStreamReader erstellt, der die gelesenen Bytes aus dem InputStream automatisch in entsprechende chars umwandelt.
Der InputStreamReader wird wiederum in einen BufferedReader gesteckt, der sich um das Buffering kümmert, wie der Name vermuten lässt. Damit lässt sich dann auch leicht eine ganze Zeile auslesen, anstatt nur einzelne Bytes.

Java:
int zahl = Integer.parseInt(sin.readLine());
sin.ReadLine() liest die Zeile aus, die Zahl aus dem InputStream, die der Client geschickt hat. Das Ergebnis wird dann direkt zu einem Integer geparst.

Java:
boolean ergebnis = isPrimzahl(zahl);
"zahl" ist ja die Zahl, die eben vom Client ausgelesen wurde. Die wird dann entsprechend überprüft.
 
Vielen Dank dir! Ich hab es jetzt endlich verstanden und auch direkt beim ersten Versuch die 2. Aufgabe geschafft, an der ich bereits 2 Stunden erfolglos arbeitete!

Vielen Vielen Dank einfach! 🙂
 

Neue Themen


Zurück
Oben